1

我写了一个异步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 应用程序的流程?目前,当我访问该网站时,代码被阻止了。

4

1 回答 1

1

现在,您必须了解 HTTP 请求和本地应用程序之间的区别。HTTP 是完全无状态的。基本上你发出一个请求,服务器处理它并发回响应。服务器不保留有关客户端的任何状态信息,它根本不知道客户端是谁。因此,在您的情况下,浏览器发出请求 -> 服务器得到它,等待 30 秒处理它,然后发回结果 -> 浏览器得到响应,这就是浏览器显示结果的地方。我假设您正在尝试做的是,浏览器发送请求,然后您希望浏览器显示某些内容,然后在 30 秒后服务器完成处理并且您想要显示其他内容。由于上述原因,这不可能与等待有关。

于 2014-11-05T19:54:09.047 回答