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问题所建议的那样,但没有奏效。如果你们能给出一些指示,我将不胜感激。谢谢。
在使用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(,否则尝试将上下文作为状态实例传递。
我知道你已经重构了这个问题(可能是一件好事(,但我为了完整性而添加了这个答案,更多地研究了你最初在做什么。