HttpModule
Web サイトに送信されるすべてのリクエストをログに記録する非同期を作成しました。要求が Web サイトに到着すると、カスタム http モジュールが WebAPI を呼び出して、情報をデータベースに記録します。IIS Express を使用した .Net 4.5/Visual Studio。
////////////Custom HTTP module////////////////////
public class MyHttpLogger : IHttpModule
{
public void Init(HttpApplication httpApplication)
{
EventHandlerTaskAsyncHelper taskAsyncHelper = new EventHandlerTaskAsyncHelper(LogMessage);
httpApplication.AddOnBeginRequestAsync(taskAsyncHelper.BeginEventHandler, taskAsyncHelper.EndEventHandler);
}
private async Task LogMessage(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
var ctx = app.Context;
//use default credentials aka Windows Credentials
HttpClientHandler handler = new HttpClientHandler()
{
UseDefaultCredentials = true
};
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://localhost:58836/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var actvity = new Activities() { AppId = "TEST123", ActivityId = 10, CreatedBy = 1 };
await client.PostAsJsonAsync("api/activity", actvity);
}
}
「api/activity」の簡略化された WebAPI コード。
public async Task<HttpResponseMessage>Post(Activities activity)
{
await Task.Delay(30000);
// Database logging code goes here….
return new HttpResponseMessage(HttpStatusCode.Created);
}
問題は、PostAsJsonAsync
が実行されると、コードがそこで停止することです。コードは待機する必要があるため、これは正しいことです。しかし、呼び出しルーチンが期待どおりに非同期に続行されず、Web サイトの応答が 30 秒遅くなります。
このコードの何が問題になっていますか? 非同期をフックしてHttpModule
も、Http アプリケーションのフローに干渉してはいけませんか? 現在、ウェブサイトにアクセスすると、コードがブロックされています。