编程语言
首页 > 编程语言> > c#-Web API请求在ApiController的ExecuteAsync方法中为空

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

作者:互联网

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

由于某些原因,ExecuteAsync方法中的Request为null.我看过其他问题,因此在您提出以下要求之前:

>我不是通过调用构造函数来初始化控制器,而是从外部设备进行的常规HTTP POST API调用.
>我在Fiddler本地尝试了相同的请求,其行为是相同的.
>我不是单元测试.
>在点击ExecuteAsync方法之前,我的请求通过一个委托处理程序,并且在委托处理程序中,我的请求对象存在(我什至添加了一些属性也没有任何问题).
>在委托处理程序的最后一行,我调用return await base.SendAsync(request,cancelToken);没有问题,并且存在请求.
>紧接着API控制器中的HttpContext.Current.Request不为null,并且可以毫无问题地进行访问.
>在API控制器中,RequestContext不为null,并且可以毫无问题地进行访问.
>在同一行中,“请求”为空.

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

解决方法:

这可能是由于您在尝试使用async / await时尝试访问HttpContext.

因此,您有两个选择:

>通过ExecuteAsync方法’HttpControllerContext’参数-controllerContext.Request访问请求.
>确保您的web.config以.NET 4.5为目标,并使用aspnet:UseTaskFriendlySynchronizationContext设置为true更新appSettings.

您可以在这里了解更多-Using HttpContext Safely After Async in ASP.NET MVC Applications.

为了更好地了解幕后情况,我建议:

>了解什么是SynchronizationContext-ExecutionContext vs SynchronizationContext
>了解它与ASP.NET-Understanding the SynchronizationContext in ASP.NET的关系.

在非常高的级别上:在同步服务器实现中,整个请求由同一线程处理,执行上下文使用TLS(线程本地存储)存储,这意味着HttpContext在代码中的任何位置都可用.

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

标签:asp-net-web-api,asp-net-web-api2,asp-net,c
来源: https://codeday.me/bug/20191111/2021051.html