C# 调用异步Web服务时,HttpContext.Current.Session为null
我正在开发一个Asp.NET3.5Web应用程序,它需要异步Web服务调用。 下面是一些代码。我已经编写了使用委托进行异步调用的代码,但不知何故,我的HttpContext.Current.Session为null。为了确保这一点,我甚至尝试传递HttpContextC# 调用异步Web服务时,HttpContext.Current.Session为null,c#,asynchronous,C#,Asynchronous,我正在开发一个Asp.NET3.5Web应用程序,它需要异步Web服务调用。 下面是一些代码。我已经编写了使用委托进行异步调用的代码,但不知何故,我的HttpContext.Current.Session为null。为了确保这一点,我甚至尝试传递HttpContext static HttpContext httpContext; public void AsyncGetUser() { httpContext = HttpContext.Current;
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);
}
我已经尝试了
,并且
<system.webServer>
<modules>
<remove name="Session"/>
<add name="Session" type="System.Web.SessionState.SessionStateModule"/>
</modules>
建议但不起作用。如果你们能给我一些建议,我将不胜感激。谢谢。您的web服务应该使用,iRequiresessionState
标记接口来启用会话。您的web服务应该使用,irerequiressessionstate
标记接口以启用会话。我最终决定重构整个项目。我最终决定重构整个项目。这可能发生在ASP.NET应用程序中,使用异步/wait
(点击)模式。要解决此问题,您需要将其添加到web.config中的appSettings
部分
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
这可能需要.NET 4.5,我注意到您没有使用此版本,但我在这里为已升级项目并使用TAP代码遇到此问题的其他人添加了此答案。这可能发生在使用异步/wait
(TAP)模式的ASP.NET应用程序中。要解决此问题,您需要将其添加到web.config中的appSettings
部分
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
这可能需要.NET 4.5,我注意到您没有使用此版本,但我在这里为已升级项目并使用TAP代码遇到此问题的其他人添加了此答案。可能是您使用代理来获取“方便”的BeginInvoke方法。这是低效的,因为在幕后,它使用了大量的反射。如果后台工作总是很重要,那么这个开销会被摊销,但有时只是几次读取,那么它将比在原始线程上花费更长的时间
您可以安装RX for 3.5,并使用“迷你TPL”完成任务。这本身就可以解决问题(问题可能是delegate.BeginInvoke的编写方式),否则请尝试将上下文作为状态实例传入
我知道您已经解决了这个问题(可能是一件好事),但我添加这个答案是为了完整性,因为我已经详细了解了您最初所做的工作。可能是您使用委托来获得“方便”的BeginInvoke方法。这是低效的,因为在幕后,它使用了大量的反射。如果后台工作总是很重要,那么这个开销会被摊销,但有时只是几次读取,那么它将比在原始线程上花费更长的时间
您可以安装RX for 3.5,并使用“迷你TPL”完成任务。这本身就可以解决问题(问题可能是delegate.BeginInvoke的编写方式),否则请尝试将上下文作为状态实例传入
我知道您已经解决了这个问题(可能是一件好事),但我添加这个答案是为了完整性,因为我更多地了解了您最初在做什么。关于什么类?在委托上调用BeginInvoke时,不涉及任何接口。是吗?在什么课上?在委托上调用BeginInvoke时,不涉及任何接口。还是真的?谢谢你的来信。我们正在运行.NET3.5(现在仍然运行)。希望不久我们能升级到4.0,我听说它比3.5更好地处理异步。谢谢你的帖子。我们正在运行.NET3.5(现在仍然运行)。希望不久我们能升级到4.0,我听说它比3.5更好地处理异步。