我寫了一個異步的HttpModule
,它記錄了所有到達網站的請求。 當請求到達網站時,自定義http模塊調用WebAPI將信息記錄到數據庫。 .Net 4.5 /使用IIS Express的Visual Studio。HttpModule - 異步不起作用
////////////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 /活動」的簡化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應用程序的流程?目前,當我訪問該網站時,代碼被阻止。
你的意思是瀏覽器在那裏停留了30秒?這很明顯,因爲瀏覽器還沒有收到迴應 – Steve 2014-11-05 19:45:28
@Steve,是的。瀏覽器卡住了30秒。如何避免這種情況?這個異步代碼有什麼問題? – 2014-11-05 19:48:09
@EricSmith:它沒有問題。您要求將請求延遲30秒,這就是發生的情況。 – 2014-11-05 21:25:21