【问题标题】:HttpContext.Current.Session is null while calling async webservices调用异步 Web 服务时 HttpContext.Current.Session 为空
【发布时间】:2012-05-05 13:37:13
【问题描述】:

我正在开发一个需要异步 Web 服务调用的 Asp.Net 3.5 Web 应用程序。 这是一些代码。我已经编写了使用委托进行异步调用的代码,但不知何故我的 HttpContext.Current.Session 为空。为了确保,我什至尝试传递 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 所建议的那样,但没有奏效。如果你们能给一些指点,我将不胜感激。谢谢。

【问题讨论】:

    标签: c# asynchronous


    【解决方案1】:

    这可能发生在使用 async/await (TAP) 模式的 ASP.NET 应用程序中。要解决此问题,您需要将其添加到 web.config 中的 appSettings 部分。

    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
    

    这可能需要 .NET 4.5,我注意到您没有使用此版本,但我在此处为已升级项目并使用 TAP 代码遇到此问题的其他人添加了此答案。

    【讨论】:

    • 感谢您的帖子。我们正在运行 .net 3.5(并且仍在运行)。希望不久的将来我们会升级到 4.0,我听说它比 3.5 更好地处理异步。
    【解决方案2】:

    您的网络服务应该使用 , IRequiresSessionState 标记接口来启用会话。

    【讨论】:

    • 上什么课?在委托上调用 BeginInvoke 时,不涉及任何接口。还是这样?
    【解决方案3】:

    我最终决定重构整个项目。

    【讨论】:

      【解决方案4】:

      您可能正在使用委托来获取“方便”的 BeginInvoke 方法。这是低效的,因为在幕后,它使用了大量的反射。如果后台工作总是很重要,那么这个开销就会被摊销,但它有时只是几次读取,那么它会比在原始线程上花费更长的时间。

      您可以为 3.5 安装 RX 并使用“迷你 TPL”来获取任务。这本身可以解决问题(问题可能是编写 delegate.BeginInvoke 的方式),否则尝试将上下文作为状态实例传入。

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

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 2011-09-03
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        相关资源
        最近更新 更多