Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用异步Web服务时,HttpContext.Current.Session为null_C#_Asynchronous - Fatal编程技术网

C# 调用异步Web服务时,HttpContext.Current.Session为null

C# 调用异步Web服务时,HttpContext.Current.Session为null,c#,asynchronous,C#,Asynchronous,我正在开发一个Asp.NET3.5Web应用程序,它需要异步Web服务调用。 下面是一些代码。我已经编写了使用委托进行异步调用的代码,但不知何故,我的HttpContext.Current.Session为null。为了确保这一点,我甚至尝试传递HttpContext static HttpContext httpContext; public void AsyncGetUser() { httpContext = HttpContext.Current;

我正在开发一个Asp.NET3.5Web应用程序,它需要异步Web服务调用。 下面是一些代码。我已经编写了使用委托进行异步调用的代码,但不知何故,我的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);
        }
我已经尝试了
,并且

<system.webServer>
<modules>

  <remove name="Session"/>
  <add name="Session" type="System.Web.SessionState.SessionStateModule"/>

</modules>


建议但不起作用。如果你们能给我一些建议,我将不胜感激。谢谢。

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

您的web服务应该使用,
irerequiressessionstate
标记接口以启用会话。

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

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

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

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


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

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

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


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

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

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


我知道您已经解决了这个问题(可能是一件好事),但我添加这个答案是为了完整性,因为我已经详细了解了您最初所做的工作。

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

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


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

关于什么类?在委托上调用BeginInvoke时,不涉及任何接口。是吗?在什么课上?在委托上调用BeginInvoke时,不涉及任何接口。还是真的?谢谢你的来信。我们正在运行.NET3.5(现在仍然运行)。希望不久我们能升级到4.0,我听说它比3.5更好地处理异步。谢谢你的帖子。我们正在运行.NET3.5(现在仍然运行)。希望不久我们能升级到4.0,我听说它比3.5更好地处理异步。