其他分享
首页 > 其他分享> > 多个等待方案中的HTTPContext

多个等待方案中的HTTPContext

作者:互联网

我正在编写一些MVC4异步控制器代码,并且遇到一个问题,即我异步调用两个长期运行的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中查找会话ID,并创建在对服务的调用中使用的已形成的WCF请求对象.

但是,在执行时,第一个调用正常进行,但是第二个异步调用失败,因为HttpContext为空,这使我相信我现在在不同的线程上.

当我在MVC3中以及.Net4.5之前执行此操作时,在通过AsyncManager(使用EAP)从Async调用返回时,我不得不手动同步线程,但是我认为我不再需要使用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;
    ...
}

>我假设在第一个代码段中,第一次等待将进程移至后台线程,因此,当我到达第二次等待时,我仍在后台线程上. HttpContext将为null,因为我无法从该线程访问它.
>我还假设在第二段代码中,我将在第一次等待之前进行所有HTTPContext查找,因此我永远不会看到HTTPContext为null,因为我从来没有从后台线程调用它.

谁能证实我的上述假设?我不想在代码中看到一个明显的错误,该错误稍后会再次出现并咬我!

更新:

我决定在此处执行过程中检查线程,看来第二个等待确实确实在与第一个等待不同的线程上发生.有趣的是,第二次调用时HttpContext似乎不为null. HttpContext.Current为null.

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

HttpContext.Current.Session.SessionId

我想我需要在第二次等待之前在某个地方进行同步,但是我不确定是什么.

解决方法:

您的代码绝对可以正常工作.我假设自从您提到MVC 3以来,这是一个升级的项目.在这种情况下,请确保您的web.config中包含以下内容:

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

标签:asynchronous,asp-net-mvc-4,c-5-0,c
来源: https://codeday.me/bug/20191031/1972077.html