2014-11-05 105 views
0

我寫了一個異步的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應用程序的流程?目前,當我訪問該網站時,代碼被阻止。

+0

你的意思是瀏覽器在那裏停留了30秒?這很明顯,因爲瀏覽器還沒有收到迴應 – Steve 2014-11-05 19:45:28

+0

@Steve,是的。瀏覽器卡住了30秒。如何避免這種情況?這個異步代碼有什麼問題? – 2014-11-05 19:48:09

+1

@EricSmith:它沒有問題。您要求將請求延遲30秒,這就是發生的情況。 – 2014-11-05 21:25:21

回答

1

現在,您必須瞭解HTTP請求和本地應用程序之間的區別。 HTTP是完全無狀態的。基本上你發出一個請求,服務器處理它併發迴響應。服務器不保留關於客戶端的任何狀態信息,它根本不知道客戶端是誰。所以在你的情況下,瀏覽器發出一個請求 - >服務器得到它,等待30秒來處理它,然後發回結果 - >瀏覽器得到了響應,這是瀏覽器顯示結果的地方。我假設你要做的是,瀏覽器發送一個請求,然後你希望瀏覽器顯示一些內容,然後在30秒後服務器完成處理,並且你想顯示其他內容。由於上面提到的原因,這不可能等待。你應該做的是編寫一些JavaScript代碼發送帶有一些標識符的請求,然後每隔x秒詢問服務器以查看任務{ID}是否已完成,如果是,結果如何。

+0

我想要做什麼?瀏覽器應該像訪問網站時一樣工作,但我想使用Async和HTTPModules捕獲網站上的流量。我正在調用Web API異步代碼來記錄活動。我只想編寫Async HTTP Framework來捕獲網站流量。 – 2014-11-05 19:58:15

+0

@EricSmith應該做的,改變 – Steve 2014-11-05 19:58:57