0

ASP.NETセッション状態を使用するように構成されたWCFサービスがあります。このWCFサービスをWPFクライアントでテストしましたが、セッション状態はさまざまなWeb要求にわたって維持されています。

現在、ブラウザーから独立した新しいHttpスタックを使用するSilverlightアプリからこれと同じWCFサービスを使用しようとしています。WCFサービスの障害を理解できるようにするには、このスタックを使用する必要があります。私の問題は、この場合、ASP.NET_SessionId cookieを使用してSet-Cookieヘッダーを応答から読み取ったり、要求にCookieヘッダーを設定したりできないことです。

これはSilverligthアプリケーションからのバインディングです。

  <customBinding>
    <binding name="customHttpBinding_IBasoaWebService" sendTimeout="01:00:00">
            <binaryMessageEncoding />
      <httpCookieContainer />
            <httpTransport maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" />
    </binding>
  </customBinding>

そして、これはWCFサービスのバインディングです。

  <basicHttpBinding>
    <binding name="basicHTTP" closeTimeout="01:00:00" openTimeout="01:00:00"
        maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
        receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
        maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="None" />
    </binding>
  </basicHttpBinding>

Silverlightアプリケーションでは、次のコードを使用して、応答のSet-Cookieヘッダーを読み取ります。

            IHttpCookieContainerManager cookieManager = channel.GetProperty<IHttpCookieContainerManager>();
            if (cookieManager.CookieContainer == null)
                cookieManager.CookieContainer = new CookieContainer();
            Uri applicationUri = new Uri(Application.Current.Host.Source, "../");
            string cookieString = cookieManager.CookieContainer.GetCookieHeader(applicationUri);
            ParseCookieString(cookieString);

そして、これはリクエストにASP.NETセッションIDCookieを設定するためのコードです。

            IHttpCookieContainerManager cookieManager = channel.GetProperty<IHttpCookieContainerManager>();
            if (cookieManager.CookieContainer == null)
                cookieManager.CookieContainer = new CookieContainer();
            Uri applicationUri = new Uri(Application.Current.Host.Source, "../");
            Cookie cookie = new Cookie("ASP.NET_SessionId", aspNetSessionId);
            cookieManager.CookieContainer.Add(applicationUri, cookie);

交換されたメッセージをFiddlerで確認すると、WCFサービスが最初の応答でSet-Cookieヘッダーを正しく送信していることがわかりますが、Silverlightはそれを読み取ることができません。また、CookieContainerクラスを介してリクエストにCookieヘッダーを設定しようとしましたが、うまくいきませんでした。Fiddlerでは表示されません。

誰かが私が間違っているに違いないことについてアドバイスをくれませんか?

よろしくお願いします。

ホセ・アントニオ・アロバ

4

2 に答える 2

1

Web アプリケーションでは、URI を使用して SessionID を設定します。(WCFサービスなら可能だと思います)

サービスの web.config で、次を定義します。

<system.web>
  <sessionState cookieless="true"></sessionState>
</system.web>

また

<sessionState cookieless="UseUri"></sessionState>

sessionId は次のように表示されます。

http://localhost:51358/(S(1wnqb23d2qe4blfxzukligdo))/default.aspx

URI で SessionID を取得および設定できます。

于 2012-06-04T22:13:03.670 に答える