HttpContext.Current.Session 在调用异步 Web 服务时为空

本文关键字:服务 Web 异步 Current Session 调用 HttpContext | 更新日期: 2023-09-27 18:32:05

我正在开发一个需要异步 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问题所建议的那样,但没有奏效。如果你们能给出一些指示,我将不胜感激。谢谢。

HttpContext.Current.Session 在调用异步 Web 服务时为空

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

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

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

您的 Web 服务应使用 、 IRequiresSessionState标记接口来启用会话。

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

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

您可以安装 RX for 3.5 并使用"迷你 TPL"来获取任务。这本身可以解决问题(问题可能是该委托的方式。编写了 BeginInvoke(,否则尝试将上下文作为状态实例传递。

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