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

4
我正在尝试在我的ApiController派生类中访问Request属性。但在ExecuteAsync方法中,Request为null。在回答你的问题之前,我已经看到了其他问题:
- 我没有通过调用构造函数来初始化控制器,它是来自外部设备的常规HTTP POST API调用。 - 我已经尝试在本地使用Fiddler进行同样的请求,行为也相同。 - 我没有进行单元测试。 - 在执行ExecuteAsync方法之前,我的请求会经过一个委托处理程序,在该处理程序中,我的请求对象存在(我甚至添加了一些属性而没有任何问题)。 - 在委托处理程序的最后一行,我调用return await base.SendAsync(request, cancellationToken);没有问题,request存在。 - 就在API控制器之后,在HttpContext.Current.Request中Request没有问题,并且可以访问。 - 在API控制器中,RequestContext不为空并且可以正常访问。 - 在同一行中,Request为null。
为什么会发生这种情况呢?我使用的是Web API 2.2(如果相关的话还有MVC 5)。

如果可能的话,你能展示一下你的POST API调用吗?这可能是由于外部设备没有正确组织请求。你尝试过使用Postman或任何REST客户端测试API了吗? - Souvik Ghosh
@SouvikGhosh 我刚刚在你的评论下尝试了使用 Fiddler,但遗憾的是结果还是一样的。 - Can Poyrazoğlu
RequestContext是Request的一部分(也可以通过Request.GetRequestContext()获得)。你能检查一下客户端如何创建请求吗?另外,你也可以检查HttpContext,它也可以为你提供有关单个请求的信息。 - Souvik Ghosh
@SouvikGhosh 你所说的客户端是什么意思?我已经尝试了两个不同的客户端,它们都是普通的HTTP请求,没有任何特殊之处。我非常确定问题不在客户端。 - Can Poyrazoğlu
1个回答

4
这可能是由于您在使用async/await时尝试访问HttpContext所致。因此,您有两个选择:
1.通过ExecuteAsync方法的“HttpControllerContext”参数访问请求- controllerContext.Request。 2.确保您的web.config针对.NET 4.5并更新appSettings,将aspnet:UseTaskFriendlySynchronizationContext设置为true。
您可以在此处阅读更多信息:在ASP.NET MVC应用程序中异步使用HttpContext
为了更好地理解内部情况,我建议:
1.了解SynchronizationContext- ExecutionContext vs SynchronizationContext 2.了解它与ASP.NET的关系- 了解ASP.NET中的SynchronizationContext
在一个同步服务器实现中,在同一线程处理整个请求时,执行上下文使用TLS(线程本地存储)存储,���意味着HttpContext在代码中的任何位置都可用。
在异步服务器实现中(async/await),请求可能由多个线程处理,需要在这些线程之间传递执行上下文。

在 web.config 中添加 <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />。 - Thiago Custodio
选项2看起来更容易,但由于某些原因它没起作用(它仍然是null)。选项1有效。虽然我很乐意了解原因。 - Can Poyrazoğlu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接