【问题标题】:HttpContext is null after await Task.Factory.FromAsync(BeginXxx, EndXxx)等待 Task.Factory.FromAsync(BeginXxx, EndXxx) 后 HttpContext 为空
【发布时间】:2012-08-15 06:39:32
【问题描述】:

我有一个 Asp.Net 应用程序,它使用 svcutil 生成的代理调用某些 WCF 服务。 生成的代理具有 APM 模式中的异步方法(BeginXxx、EndXxx)。

我正在使用异步定位包以利用新的async/await 模式,并且我的目标平台是 .net 4.0(否则我不必使用异步定位包)。

我正在使用Task<T>.Factory.FromAsync 将 APM 模式转换为我可以等待的任务。

我的代码看起来有点像这样(假设服务方法不带参数并返回一个 int:

int result = await Task<int>.Factory.FromAsync(proxy.BeginXxx, proxy.EndXxx, state: null);
HttpContext.Current.Items["reuslt"] = result;

第二行抛出NullReferenceException

我假设原因是回调(即在 await 调用之后运行的所有内容)没有原始同步上下文。

其他方法(如 Factory.StartNew)有 overloads 接收可用于保留上下文的 TaskScheduler

FromAsync 方法也有 overloads 接收 TaskScheduler,但没有一个将 begin 方法作为参数。

假设我不想开始手动将 Http 上下文作为方法参数传递给在此行之后调用的所有方法,我如何使用获取任务调度程序的重载或以其他方式获取 .Net 来尊重我的同步上下文?

【问题讨论】:

  • 你确定在 FromAsync 调用之前同步上下文设置正确吗?
  • 在 FromAsync 调用之前,我可以访问 HttpContext。

标签: c# wcf asynchronous task-parallel-library async-await


【解决方案1】:

我怀疑问题实际上出在 ASP.NET 管道中,而不是在 SynchronizationContext 中。

Async Targeting Pack 启用 async/await 支持,但有 a lot of changes in ASP.NET 4.5 to make it async-friendly,并且 Targeting Pack 不包含该支持。

尝试使用 RegisterAsyncTask(用于 Web 表单)或 AsyncManager(用于 MVC)来帮助 ASP.NET 管道。即便如此,管道中仍有一些地方无法采用异步代码(在 ASP.NET 4.5 中仍然如此,但至少 4.5 会检测到这一点并引发错误)。

【讨论】:

  • 所以我尝试使用接收调度程序的重载,但无济于事。看来你的分析是正确的。我在流程的开头(虽然它仍然不为空)结束了获取 HttpContext.Current ,并将它传递给流程的其余部分。
  • 关于 IIS 和 .net 4.5 中的 webapi 的任何提示。它的行为与@ronyl 相同
猜你喜欢
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多