2012-04-24 5 views
1

私は、Async Webサービス呼び出しを必要とするAsp.Net 3.5 Webアプリケーションで作業しています。 ここにいくつかのコードがあります。デリゲートを使用して非同期呼び出しのコードを書いていますが、何とか私のHttpContext.Current.Sessionはnullです。確かに、私はHttpContextを渡してみました。async 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); 
     } 

このSO questionが提案したがうまくいかなかったように私は<modules runAllManagedModulesForAllRequests="true">

<system.webServer> 
<modules> 

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

</modules> 

を試してみました。私はあなたがいくつかの指針を与えることができれば感謝します。ありがとう。

答えて

0

私はプロジェクト全体をリファクタリングするという決定に達しました。

0

ウェブサービスでは、IRequiresSessionStateマーカーインターフェイスを使用してセッションを有効にする必要があります。

+0

私はそれを試しましたが、同じエラーが発生しました。 – Krishna

+0

どのクラス?デリゲートでBeginInvokeを呼び出すと、インターフェイスは関与しません。またはそれは? – Schultz9999

1

これは、async/await(TAP)パターンを使用してASP.NETアプリケーションで発生する可能性があります。これを解決するには、web.configのappSettingsセクションにこれを追加する必要があります。

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

これは、.NET 4.5を必要とするかもしれない、私はあなたがこのバージョンを使用していないに注意してくださいが、私はプロジェクトをアップグレードして、そのTAPコードでこの問題をヒットしている他の人のために、ここでこの答えを追加します。

+0

投稿していただきありがとうございます。私たちは.net 3.5を走らせていました(まだやります)。うまくいきなりいつか我々は3.5よりも良い非同期を扱う4.0にアップグレードします。 – Krishna

0

デリゲートを使用して「便利な」BeginInvokeメソッドを取得している可能性があります。これはシーンの背後ではReflectionの負荷を使用するので非効率的です。バックグラウンドの作業が常に重要である場合、このオーバーヘッドは償却されますが、時にはそれがほんの数回読み込まれる場合、元のスレッドで行うよりも時間がかかります。

RX for 3.5をインストールして、タスクで「ミニTPL」を使用することができます。これはそれ自体で問題を解決することができます(問題はdelegate.BeginInvokeが書き込まれる方法かもしれません)。そうでない場合は、コンテキストを状態インスタンスとして渡してみてください。

私はあなたが問題(おそらく良いこと)からリファクタリングしたことを知っていますが、あなたが元々行っていたことをさらに見ているためにこの答えを追加します。