2017-01-16 3 views
2

私はASP.NET Core Webサイトを持ち、EFCoreを使用しています。 私はデータベースへのログのようないくつかの作業をしたいと思いますが、より速く答えるためにユーザーに応答を送信した後です。ASP.NETコアのレスポンスの後にいくつか作業します

私は別のスレッドでそれを行うことができましたが、DbContextの非同期アクセスのため安全でないかどうかはわかりません。それを行うための推奨される方法はありますか?その理由の

public async Task<IActionResult> Request([FromForm]RequestViewModel model, string returnUrl = null) 
{ 
    try 
    { 
     var newModel = new ResponseViewModel(model); 
     // Some work 
     return View("RequestView",newModel) 
    } 
    finally 
    { 
     // Some analysis on the request 
     // I would like to defer this part 
     await Log(model); 
    } 
} 

一つは、私が答えるために必要とされていないウェブサービス(ジオコーディング)を、呼び出したいが、良いログ(私は座標の都市/国を必要とする)上で動作するということです。

+0

1にHangFireを使用しての私のblog postである可能性があり全部ダウン? ASP.NETでのスレッドの開始(コアまたはレガシー)は非常に悪く、ASP.NETがスレッドプールからスレッドを管理する方法を乱し、通常はパフォーマンスが向上する代わりに悪化します(メモリスレッドの割り当て、コンテキストスイッチ)。 3.ボトルネックであることを実際に主張し、それをバックアップするための頑強なデータがある場合は、メッセージ(メモリまたは分散)をキューに入れてバックグラウンドで処理してください) – Tseng

+0

実際には重いわけではありませんが、データベースへの書き込み(リクエストがすでに完了しているかどうかを確認する)、ユーザーに何も通知しないようにする前に答えを出したいと思っています。 – Jean

答えて

-1

ActionFilterAttributeから継承する新しいクラスを作成し、OnResultExecutedメソッドを上書きしてロギングを実行し、ロギングを実行するコントローラアクションに属性クラスを適用します。

+2

リクエストが完了した後**ロギングを行いたいので、意図した目標を達成できません**。 ActionFilterはまだリクエストが実行されている間に実行されます – Tseng

2

あなたが望むことをするための方法はありません。

しかし、ここでは可能なアプローチです:

  1. は、そのキューにメッセージを追加
  2. 、要求がクライアントに送り返される直前にキューと労働者(スレッドまたはプロセス)
  3. を持っています
  4. 作業員は、将来そのメッセージをピックアップして処理します。どこか別の場所ではなく、要求スレッドに取り組んで実行されるため

、サーバは要求スレッドを完了することができますし、労働者が残っているものを行うことができます。

+0

これは私が考えていた1つのオプションです。最適でない場合でも、おそらく最も効率的です。 私の代わりのオプションは、 "raw"要求をログに記録し、ASPから独立したWindowsサービスにraw要求を後処理することです... EFはスレッドにはあまり馴染んでいないので、私は最良の解決策についてはわかりません(2番目の問題は確実に問題にならないでしょうが、セットアップと更新のためにもっと多くの作業が必要です) – Jean

-1

ハングファイアをお試しください。 Hangfireは、.NETおよび.NETコアアプリケーションでバックグラウンド処理を実行する簡単な方法です。 Windowsサービスまたは別のプロセスは必要ありません。 永続ストレージによってバックアップされます。オープンで商用利用のため無料。

あなたは

var jobId = BackgroundJob.Enqueue(() => Log(model)); 

ような何かをして、ここでは、あなたのロギングがそんなに遅く遅くするあなたの要求よりであることを何をしているASP.NETコア

関連する問題