gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:58:40 25 4
gpt4 key购买 nike

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

由于某些原因,RequestExecuteAsync 方法中为 null。我看过其他问题,所以在你提问之前:

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

为什么会这样?我使用的是 Web API 2.2(和 MVC 5,如果相关的话)。

最佳答案

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

所以,你有两个选择:

  1. 通过 ExecuteAsync 方法“HttpControllerContext”参数 - controllerContext.Request 访问请求。
  2. 确保您的 web.config 以 .NET 4.5 为目标并更新 appSettings 并将 aspnet:UseTaskFriendlySynchronizationContext 设置为 true。

您可以在此处阅读更多信息 - Using HttpContext Safely After Async in ASP.NET MVC Applications .

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

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

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

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

关于c# - Web API 请求在 ApiController 的 ExecuteAsync 方法中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42782141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com