C# HttpContext在wait Task.Factory.FromAsync(BeginXxx,EndXxx)之后为null
我有一个Asp.Net应用程序,它使用svcutil生成的代理调用某些WCF服务。 生成的代理具有APM模式中的异步方法(BeginXxx、EndXxx) 我使用异步目标包是为了利用新的C# HttpContext在wait Task.Factory.FromAsync(BeginXxx,EndXxx)之后为null,c#,wcf,asynchronous,task-parallel-library,async-await,C#,Wcf,Asynchronous,Task Parallel Library,Async Await,我有一个Asp.Net应用程序,它使用svcutil生成的代理调用某些WCF服务。 生成的代理具有APM模式中的异步方法(BeginXxx、EndXxx) 我使用异步目标包是为了利用新的async/await模式,我的目标平台是.net 4.0(否则我就不必使用异步目标包) 我正在使用Task.Factory.fromsync将APM模式转换为可以等待的任务 我的代码看起来有点像这样(假设服务方法不接受任何参数并返回int: int result = await Task<int>.
async/await
模式,我的目标平台是.net 4.0(否则我就不必使用异步目标包)
我正在使用Task.Factory.fromsync
将APM模式转换为可以等待的任务
我的代码看起来有点像这样(假设服务方法不接受任何参数并返回int:
int result = await Task<int>.Factory.FromAsync(proxy.BeginXxx, proxy.EndXxx, state: null);
HttpContext.Current.Items["reuslt"] = result;
int result=wait Task.Factory.fromsync(proxy.BeginXxx,proxy.EndXxx,state:null);
HttpContext.Current.Items[“reuslt”]=结果;
第二行抛出一个NullReferenceException
我假设原因是回调(即在等待调用之后运行的所有内容)没有原始的同步上下文
其他方法(如Factory.StartNew)接收可用于保存上下文的TaskScheduler
FromAsync方法还具有接收TaskScheduler
,但没有一个将begin方法作为参数的方法
假设我不想手动将Http上下文作为方法参数传递给此行之后调用的所有方法,那么如何使用获取任务调度程序或以其他方式获取.Net的重载来尊重我的同步上下文?我怀疑问题实际上在ASP.Net管道中,而不是在
同步C中ontext
Async Targeting Pack启用了Async
/Wait
支持,但有,而且Targeting Pack不包括该支持
尝试使用(用于web窗体)或(用于MVC)帮助ASP.NET管道。即使如此,管道中仍有一些地方无法接受异步代码(在ASP.NET 4.5中仍然是这样,但至少4.5会检测到这一点并抛出错误).是否确定在FromAsync调用之前正确设置了synccontext。在FromAsync调用之前,我可以访问HttpContext。因此,我尝试使用接收计划程序的重载,但没有效果。您的分析似乎是正确的。我在流的开头结束了获取HttpContext.Current的过程(但它仍然不是null)通过流的其余部分传递它。IIS和.net 4.5中webapi的任何提示。其行为与@ronyl相同