Web API请求在ApiController的ExecuteAsync方法中为空

时间:2017-03-14 09:28:12

标签: c# asp.net asp.net-web-api asp.net-web-api2

我正在尝试访问Request派生类中的ApiController属性。

出于某种原因,Request方法中ExecuteAsync为空。我已经看到了其他问题,所以在你问之前:

  • 通过调用构造函数初始化控制器,它是来自外部设备的常规HTTP POST API调用。
  • 我在Fiddler本地尝试了相同的请求,行为完全相同。
  • 我不是单元测试。
  • 在点击ExecuteAsync方法之前,我的请求通过委托处理程序,在委托处理程序中,我的请求对象存在(我甚至添加了一些属性没有任何问题)。
  • 在委派处理程序的最后一行,我调用return await base.SendAsync(request, cancellationToken);没有问题,request 存在
  • 在API控制器之后,HttpContext.Current.Request不为空且可以无问题地访问。
  • 在API控制器中,RequestContext不为空且可以无问题地访问。
  • 在同一行中,Request为空。

为什么会发生这种情况?我在Web API 2.2(和MVC 5,如果相关)。

1 个答案:

答案 0 :(得分:3)

这可能是因为您在使用async / await时尝试访问HttpContext。

所以,你有两个选择:

  1. 通过ExecuteAsync方法'HttpControllerContext'参数访问请求 - controllerContext.Request。
  2. 确保您的web.config针对.NET 4.5并使用aspnet更新appSettings:UseTaskFriendlySynchronizationContext设置为true。
  3. 您可以在此处阅读更多内容 - Using HttpContext Safely After Async in ASP.NET MVC Applications

    为了更好地了解幕后发生的事情,我建议:

    1. 了解什么是SynchronizationContext - ExecutionContext vs SynchronizationContext
    2. 了解它与ASP.NET的关联 - Understanding the SynchronizationContext in ASP.NET
    3. 在非常高的级别:在同步服务器实现中,整个请求由同一个线程处理,执行上下文使用TLS(线程本地存储)存储,意味着HttpContext在代码中的任何位置都可用。 / p>

      在异步服务器实现(async / await)中,请求可能由多个线程处理,并且需要在这些线程之间传递执行上下文。