我正在开发一个需要Async Web服务调用的Asp.Net 3.5 Web应用程序。 这是一些代码。我已经使用委托编写了Async调用的代码,但不知怎的,我的HttpContext.Current.Session为null。为了确保,我甚至尝试传递HttpContext。
static HttpContext httpContext;
public void AsyncGetUser()
{
httpContext = HttpContext.Current;//not getting Session as null here
GetUserDelegate delegate = new GetUserDelegate(InvokeWrapperMethod);
IAsyncResult async = delegate.BeginInvoke(httpContext,new AsyncCallback(CallbackMethod), null);
}
static void CallbackMethod(IAsyncResult ar)
{
AsyncResult result = (AsyncResult)ar;
GetUserDelegate caller = (GetUserDelegate)result.AsyncDelegate;
caller.EndInvoke(ar);
}
private static void InvokeWrapperMethod(HttpContext hc)
{
HttpContext.Current = hc; //getting Session as null here
UserInfo userInfo = Service.GetUserInfo();
SetInSession(USER_INFO, userInfo);
}
我尝试了<modules runAllManagedModulesForAllRequests="true">
和
<system.webServer>
<modules>
<remove name="Session"/>
<add name="Session" type="System.Web.SessionState.SessionStateModule"/>
</modules>
这个SO question建议但是没有用。如果你们能给出一些指示,我将不胜感激。感谢。
答案 0 :(得分:1)
使用async/await
(TAP)模式的ASP.NET应用程序中可能会发生这种情况。要解决此问题,您需要将其添加到web.config中的appSettings
部分。
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
这可能需要.NET 4.5,我注意到你没有使用这个版本,但我在这里为已经升级了项目并且正在使用他们的TAP代码解决这个问题的其他人添加了这个答案。
答案 1 :(得分:0)
您的网络服务应使用IRequiresSessionState
标记界面启用会话。
答案 2 :(得分:0)
我最终决定重构整个项目。
答案 3 :(得分:0)
可能是您正在使用委托来获取'方便'的BeginInvoke方法。这在幕后是低效的,它使用了反射的负载。如果后台工作总是很重要,那么这个开销会被分摊,但它有时只是几次读取,那么它比在原始线程上执行它需要的时间更长。
您可以安装RX for 3.5并使用'mini TPL'来完成任务。这本身可以解决问题(问题可能是编写delegate.BeginInvoke的方式),否则尝试将上下文作为状态实例传递。
我知道你已经解决了这个问题(可能是一件好事)但我为了完整性添加了这个答案,更多地考虑了你最初在做什么。