gpt4 book ai didi

c# - 多个等待场景中的 HTTPContext

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

我正在编写一些 MVC4 异步 Controller 代码,遇到一个问题,即我异步调用两个长时间运行的 Web 服务,而第二个调用似乎在错误的线程上。

这是代码片段:

public async Task<ActionResult> AmendDetails(Model model) 
{
ClientMaintenanceClient clientService = new ClientMaintenanceClient();
UpdateResponse clientResponse = await clientService.GetForUpdateAsync(clientService.CreateRequest(model.Id));

StaticDataEnquiryClient staticService = new StaticDataEnquiryClient();
DataResponse staticResponse = await staticService.GetPayMethodsAsync(staticService.CreateRequest());

...
}

本质上,对 CreateRequest() 的调用将从 HttpContext 中查找 session ID,并创建用于服务调用的成型 WCF 请求对象。

然而,在执行时,第一次调用正常,但第二次异步调用失败,因为 HttpContext 为 null,这让我相信我现在在不同的线程上。

当我在 MVC3 中执行此操作时,在 .Net4.5 之前,我必须在通过 AsyncManager(使用 EAP)从异步调用返回时手动同步线程,但我认为我不再需要使用 TAP 执行此操作.

如果我使用下面的代码片段并行执行代码,问题就会消失。

public async Task<ActionResult> AmendDetails(Model model) 
{
ClientMaintenanceClient clientService = new ClientMaintenanceClient();
var clientTask = clientService.GetForUpdateAsync(clientService.CreateRequest(model.Id));

StaticDataEnquiryClient staticService = new StaticDataEnquiryClient();
var staticTask = staticService.GetPayMethodsAsync(staticService.CreateRequest());

await Task.WhenAll(clientTask,staticTask);
UpdateResponse clientResponse = await clientTask;
DataResponse staticResponse = await StaticTask;
...
}
  • 我假设在第一个片段中,第一个 await 将进程转移到后台线程,因此当我到达第二个 await 时,我仍在后台线程中。 HttpContext 将为空,因为我无法从该线程获取它。

  • 我还假设在第二个代码片段中,我在第一次等待之前执行所有 HTTPContext 查找,所以我从来没有看到 HTTPContext 为 null,因为我从来没有从后台线程调用它。

谁能证实我上面的假设?我不想查看我的代码中的一个明显错误,它稍后会回来咬我!

更新:

我决定在这里执行期间检查线程,看起来第二个等待确实发生在与第一个等待不同的线程上。有趣的是,在第二次调用时 HttpContext 似乎不为空。 HttpContext.Current 为空。

我正在通过以下方式访问 session ID:

HttpContext.Current.Session.SessionId

我猜我需要在第二次等待之前在某个地方同步一些东西,但我不确定是什么。

最佳答案

您的代码绝对应该有效。我假设因为你提到了 MVC 3,这是一个升级的项目。在这种情况下,请确保您的 web.config 中包含以下内容:

<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>

关于c# - 多个等待场景中的 HTTPContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16152023/

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