1

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

4

4 回答 4

1

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

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

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

于 2013-06-28T10:17:12.257 回答
0

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

于 2012-04-24T21:14:45.457 回答
0

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

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

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

于 2013-07-01T08:16:49.113 回答
0

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

于 2012-04-26T20:51:54.763 回答