c# - 等待 Task.Factory.FromAsync(BeginXxx, EndXxx) 后 HttpContext 为空

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

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

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

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

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

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 来尊重我的同步上下文?

最佳答案

我怀疑问题实际上出在 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 帮助 ASP.NET 管道(对于网络表单)或 AsyncManager (对于 MVC)。即便如此,管道中仍有一些地方不能采用异步代码(在 ASP.NET 4.5 中仍然如此,但至少 4.5 会检测到这一点并引发错误)。

关于c# - 等待 Task.Factory.FromAsync(BeginXxx, EndXxx) 后 HttpContext 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029091/

相关文章:

c# - C#数据库应用程序在清理表时不断崩溃(?)

c# - WCF - 不要序列化(发出)空集合

c# - 即发即弃(异步)ASP.NET 方法调用

python - 异步上下文管理器

带有 0 或小数的 C# Masked TextBox

c# - 从外部 Web 服务自行更新 POCO 模型类

c# - 在 silverlight 中的页面上播放视频

c# - 流式下载从WCF到android,使用Json、Rest还是soap?

wcf - 无法记录 WCF 消息正文

swift - 在 Collection View 中随机上传帖子 - Swift 和 Firebase