2012-04-24 54 views
1

我正在處理需要異步Web服務調用的Asp.Net 3.5 Web應用程序。 這是一些代碼。我已經使用委託編寫了Async調用代碼,但不知何故,我的HttpContext.Current.Session爲null。爲了確保,我甚至嘗試傳遞HttpContext。調用異步webservices時HttpContext.Current.Session爲空

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建議,但沒有奏效。如果你們能提供一些建議,我將不勝感激。謝謝。

回答

0

我最終決定重構整個項目。

0

您的web服務應該使用IRequiresSessionState標記界面來啓用會話。

+0

我試過了,但遇到同樣的錯誤。 – Krishna 2012-04-24 21:27:01

+0

在什麼課上?在代理上調用BeginInvoke時,不涉及任何接口。或者是? – Schultz9999 2013-03-15 21:12:53

1

這可能發生在使用async/await(TAP)模式的ASP.NET應用程序中。爲了解決這個問題,你需要把它添加到web.config中的appSettings部分。

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

這可能需要.NET 4.5,我注意到你沒有使用這個版本,但我在這裏補充這個答案對他人已升級的項目,並擊中其TAP代碼這個問題。

+0

感謝您的發佈。我們正在運行.net 3.5(&仍然如此)。希望很快我們會升級到4.0,我聽說,它處理的異步比3.5好。 – Krishna 2013-06-28 18:57:08

0

這可能是因爲您正在使用委託來獲取'方便的'BeginInvoke方法。這是幕後的效率低下,它使用了一個反射的負載。如果後臺工作總是有意義的,那麼這個開銷會被分攤,但它有時只是一些讀取,然後比在原始線程上花費更長的時間。

您可以安裝RX 3.5並使用'mini TPL'來獲取任務。這本身可以解決問題(這個問題可能是寫入delegate.BeginInvoke的方式),否則嘗試將上下文作爲狀態實例傳遞。

我知道你已經重構出了問題(可能是一件好事),但我增加了這個答案的完整性,更多地關注了你原來的工作。