1

非同期Webサービス呼び出しを必要とするAsp.Net3.5Webアプリケーションに取り組んでいます。ここにいくつかのコードがあります。デリゲートを使用して非同期呼び出しのコードを記述しましたが、どういうわけか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);
        }

私は試しまし<modules runAllManagedModulesForAllRequests="true">

<system.webServer>
<modules>

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

</modules>

このSOの質問が示唆したように、機能しませんでした。皆さんがいくつかの指針を与えることができれば幸いです。ありがとう。

4

4 に答える 4

1

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

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

これには.NET4.5が必要な場合があります。このバージョンを使用していないことに注意してください。ただし、プロジェクトをアップグレードし、TAPコードでこの問題が発生している他のユーザーのためにこの回答をここに追加します。

于 2013-06-28T10:17:12.257 に答える
0

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

于 2012-04-24T21:14:45.457 に答える
0

プロジェクト全体をリファクタリングすることにしました。

于 2012-04-26T20:51:54.763 に答える
0

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

RX for 3.5をインストールし、「ミニTPL」を使用してタスクを取得できます。これ自体で問題を解決できます(問題はそのdelegate.BeginInvokeの記述方法である可能性があります)。それ以外の場合は、コンテキストを状態インスタンスとして渡してみてください。

問題をリファクタリングしたことは知っていますが(おそらく良いことです)、最初に何をしていたかを詳しく調べて、完全を期すためにこの回答を追加します。

于 2013-07-01T08:16:49.113 に答える