2

単純なWCFWebサービスを呼び出すjQueryJavaScriptがあります。JavaScriptでCookieを設定し、サーバー側で読み取るのはかなり簡単です。

これがそのコードです。

クライアント側(JavaScript):

document.cookie = "father=christmas";

サーバー側(WCFのC#):

var cookieHeader = WebOperationContext.Current.IncomingRequest.Headers[System.Net.HttpRequestHeader.Cookie];
if (!String.IsNullOrEmpty(cookieHeader))
{
    var match = cookieHeader.Split(';').Select(cookie => cookie.Split('=')).FirstOrDefault(kvp => kvp[0] == "father");
    if (match != null)
    {
        result = match[1]; // result now equals "christmas"
    }
}

ただし、サーバーのWCFにCookieを設定し、クライアントでそれを読み取りたいと思います。これが失敗した私のコードです。

サーバー側(WCFのC#):

WebOperationContext.Current.OutgoingResponse.Headers[System.Net.HttpResponseHeader.SetCookie] = "cloud=lonely";

クライアント側(jQuery JavaScript):

$(document).ready(function () {
    $.ajax({
        url: "/ScratchpadSite/Service.svc/Hallo",
        type: "POST",
        success: function (data, textStatus, jqXHR) {
            var xrh = jqXHR.getAllResponseHeaders();
            $('body').html('<p>Father ' + data.d + '<\/p>');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            $('body').html('<p>' + textStatus + ': ' + errorThrown + '<\/p>');
        }
    });
});

ただし、xhrの値(「cloud = lonely」Cookieが含まれることを期待していた変数)は次のとおりです。

サーバー:ASP.NET開発サーバー/10.0.0.0
日付:2012年4月4日水曜日15:29:27 GMT
X-AspNet-バージョン:4.0.30319
コンテンツの長さ:17
キャッシュ制御:プライベート
コンテンツタイプ:application / json; charset = utf-8
接続:閉じる

(注:私のWebページ(JavaScriptを含む)とWCFサービスは同じサーバー上にあるため、クロスドメインの問題は発生しないはずです。)

応答ヘッダーCookieを正しく設定していますか?もしそうなら、私はクライアントに戻って価値を見つけるためにどこを探すべきですか?そうでない場合、私はこれをどのように行うべきですか?

4

3 に答える 3

0

HTTPリクエストを送信しているのと同じドメインによって以前に設定されたすべてのCookieは、リクエスト内で自動的に送信される必要があります。つまり、HTTPリクエストの送信先のドメインが以前にそのCookieに設定されているように、すべてのCookieがHTTPリクエスト内で自動的に送信されます。 。応答方法で、クライアントにCookieを設定する場合は、「Set-Cookie」という名前の応答ヘッダーを追加できます。

于 2012-12-03T17:40:52.387 に答える
0

これが答えではないことを願っていますが、この質問には興味深いコメントがあります。Jfriend00は、このW3仕様に従って、 getAllResponseHeaders()がSet-Cookieヘッダーを除くすべてのヘッダーを返すことを指摘しています。そして、Dan Taoは、応答がブラウザーによって処理されると、ブラウザーはCookie情報をコピーしますが、コールバックが呼び出されるまではコピーしないと説明しています。ダンは「完全なコールバックにおけるある種のsetTimeout取引」を提案しています。

DrewMarshが「WCF->ASMXand Cookies」に対するコメントで提案した別の可能なオプション(私は試していません)は、WCFコードでメッセージインスペクターを使用することです。

タイムアウトを設定するのは気が進まない(ハックのように感じる)ので、WCFコードをロジックの一部であるメッセージインスペクターで追跡するのは難しいので、別の回答を待つ間、応答ヘッダー自体に書き込みます(次のようなWCFコードのCookie):

WebOperationContext.Current.OutgoingResponse.Headers.Add("cloud", "lonely");

次に、JavaScript / jQuery / Ajaxコンプリートハンドラーでそれを読み取り、次のようにCookieに書き込みます。

$(document).ready(function () {
    $.ajax({
        url: "/ScratchpadSite/Service.svc/Hallo",
        type: "POST",
        success: function (data, textStatus, jqXHR) {
            $('body').html('<p>Father ' + data.d + '<\/p>');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            $('body').html('<p>' + textStatus + ': ' + errorThrown + '<\/p>');
        },
        complete: function (jqXHR, textStatus) {
            var cloudsFeeling = jqXHR.getResponseHeader("cloud");
            if (cloudsFeeling) {
                document.cookie = "cloud=" + cloudsFeeling;
            }
        },
    });
});

この使用法のために設計されたと思ったCookieの代わりにHTTPResponseHeaderを使用するのは不快ですので、より良い答えを提案してください。

于 2012-04-05T11:03:29.393 に答える
0

クッキーの取得、書き込み、削除を可能にする$ .cookieプラグインを使用して、非常にスマートな方法でクッキーを処理できます。

それがあなたを助けることを願っています。

于 2012-06-25T19:18:12.547 に答える