C# ApicController的ExecuteAsync方法中的Web API请求为空

C# ApicController的ExecuteAsync方法中的Web API请求为空,c#,asp.net,asp.net-web-api,asp.net-web-api2,C#,Asp.net,Asp.net Web Api,Asp.net Web Api2,我正在尝试访问我的ApiController派生类中的Request属性 由于某种原因,Request在ExecuteAsync方法中为null。我看到了其他问题,所以在你提问之前: 我不是通过调用构造函数来初始化控制器,它是来自外部设备的常规HTTP POST API调用 我在本地尝试了与Fiddler相同的请求,行为是相同的 我不是单元测试 在点击ExecuteAsync方法之前,我的请求通过一个委托处理程序,在委托处理程序中,我的请求对象存在(我甚至添加了一些属性,没有任何问题) 在委托

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

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

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

为什么会发生这种情况?我使用的是Web API 2.2(以及MVC 5,如果相关的话)。

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

因此,您有两种选择:

  • 通过ExecuteAsync方法“HttpControllerContext”参数-controllerContext.request访问请求
  • 确保您的web.config以.NET 4.5为目标,并将aspnet:UseTaskFriendlySynchronizationContext设置为true更新appSettings
  • 你可以在这里阅读更多-

    为了更好地了解引擎盖下发生的事情,我建议:

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


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

    如果可能,能否显示POST API调用?可能是外部设备未正确形成请求。你有没有试过用邮递员或任何REST客户机测试API?@SouvikGhosh根据你的评论,我刚刚试过用Fiddler。不幸的是,它仍然是一样的。RequestContext是请求的一部分(也可以通过Request.GetRequestContext()获得)。您可以检查如何在客户端创建请求吗?此外,您还可以检查HttpContext,它还可以为您提供有关单个请求的信息。@SouvikGhosh您所说的客户端是什么意思?我已经尝试了两个不同的客户端,它们是常规HTTP请求,没有什么特别之处。我敢肯定不是客户。在web.configOption中,选项2似乎更简单,但由于某种原因它不起作用(仍然为空)。备选办法1奏效了。不过我很乐意知道原因。