3

C# WCF WebHttpBinding でセッションを作成することは可能ですか? (Cookie を使用した php セッションのようなものなど)

4

2 に答える 2

4

WCFはセッションをサポートしますが、ある程度のセキュリティを備えたバインディングが必要です。このリンクで説明する必要があります。

http://social.msdn.microsoft.com/Forums/is/wcf/thread/7185e8b7-d4e5-4314-a513-ec590f26ffde

セッションマネージャを自分で実装することもできます。これは、セッションのリストを維持する静的クラスです。各セッションには「System.Timers.Timer」を設定してセッションのタイムアウトを指定し、セッションタイマーの期限が切れたときに呼び出されるイベントハンドラーをフックできます。

その場合、セッションマネージャーはセッションを破棄できます。または、Guid(セッションID)を参照として使用してセッションが呼び出された場合は、タイマーをリセットしてセッションを存続させることができます。

Cookie(おそらくセッションID)に関しては、次のようなメソッドを使用して、リクエストでCookieを取得および設定できます。

    /// <summary>Gets a cookie value from cookies for given key.</summary>
    /// <param name="cookieKey">The key for the cookie value we require.</param>
    /// <returns>The cookie value.</returns>
    /// <exception cref="KeyNotFoundException">If the key was not found.</exception>
    private string GetCookieValue(string cookieKey)
    {
        string cookieHeader = WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.Cookie];
        string[] cookies = cookieHeader.Split(';');
        string result = string.Empty;
        bool cookieFound = false;

        foreach (string currentCookie in cookies)
        {
            string cookie = currentCookie.Trim();

            // Split the key/values out for each cookie.
            string[] cookieKeyValue = cookie.Split('=');

            // Compare the keys
            if (cookieKeyValue[0] == cookieKey)
            {
                result = cookieKeyValue[1];
                cookieFound = true;
                break;
            }
        }

        if (!cookieFound)
        {                
            string msg = string.Format("Unable to find cookie value for cookie key '{0}'", cookieKey);
            throw new KeyNotFoundException(msg);
        }

        // Note: The result may still be empty if there wasn't a value set for the cookie.
        // e.g. 'key=' rather than 'key=123'
        return result;
    }        

    /// <summary>Sets the cookie header.</summary>
    /// <param name="cookie">The cookie value to set.</param>
    private void SetCookie(string cookie)
    {
        // Set the cookie for all paths.
        cookie = cookie + "; path=/;" ;
        string currentHeaderValue = WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.SetCookie];

        if (!string.IsNullOrEmpty(currentHeaderValue))
        {
            WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.SetCookie]
                = currentHeaderValue + "\r\n" + cookie;
        }
        else
        {
            WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.SetCookie] = cookie;
        }
    }

Cookieを「sessionId={myGuidHere}」のように設定するだけです。

とにかくそれがお役に立てば幸いです。申し訳ありませんが、クライアント用に作成しているため、これ以上サンプルコードを投稿することはできません。

ペテスキ

于 2011-06-08T14:17:55.757 に答える
1

Cookie を操作するだけの場合、WebHttpBinding には既にその機能がありますが、既定ではオフになっています。PHP セッションが提供するその他の機能についてはよくわかりませんが、WebHttpBinding はセッションレス HTTP 要求/応答パターンの上に構築されているため、@peteski22 が回答でスケッチしているように、独自のパターンを展開する必要があります。

于 2011-06-08T14:46:34.797 に答える