我写了一个异步HttpModule
记录所有进入网站的请求。当请求到达网站时,自定义 http 模块调用 WebAPI 将信息记录到数据库中。.Net 4.5/Visual Studio 与 IIS Express。
////////////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
被执行时,代码会停在那里。这是正确的,因为代码必须等待。但是调用例程没有像预期的那样异步继续,网站响应慢了 30 秒。
这段代码有什么问题?挂钩异步HttpModule
不应该干扰 Http 应用程序的流程?目前,当我访问该网站时,代码被阻止了。