2014-11-05 115 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