调用async webservices时,HttpContext.Current.Session为null

时间:2012-04-24 21:07:17

标签: c# asynchronous

我正在开发一个需要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建议但是没有用。如果你们能给出一些指示,我将不胜感激。感谢。

4 个答案:

答案 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的方式),否则尝试将上下文作为状态实例传递。

我知道你已经解决了这个问题(可能是一件好事)但我为了完整性添加了这个答案,更多地考虑了你最初在做什么。