2

我有一些 jQuery JavaScript 调用一个简单的 WCF Web 服务。对我来说,在 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
X-AspNet-版本:4.0.30319
内容长度:17
缓存控制:私有
内容类型:应用程序/json;字符集=utf-8
连接:关闭

(注意我的网页(包括 JavaScript)和 WCF 服务驻留在同一台服务器上,因此应该没有跨域问题。)

我是否正确设置了响应标头 cookie?如果是这样,我应该在哪里寻找返回给客户的价值?如果不是,我应该怎么做?

4

3 回答 3

0

我希望这不是答案,但对这个问题有一些有趣的评论。Jfriend00指出,根据此 W3 规范getAllResponseHeaders() 将返回除 Set-Cookie 标头之外的所有标头。Dan Tao解释说,虽然浏览器会(可能?)在浏览器处理响应后复制 cookie 信息,但直到调用回调之后才会发生这种情况!Dan 建议“在完整的回调中进行某种 setTimeout 交易”。

Drew Marsh在对他对“WCF -> ASMX 和 Cookies”的回答的评论中建议的另一个可能的选项(我没有尝试过)是在 WCF 代码中使用消息检查器。

我不愿意设置超时(感觉像 hack),我发现 WCF 代码更难遵循消息检查器的部分逻辑,所以在等待另一个答案时,我将写入响应标头本身(而不是cookie)在 WCF 代码中,如下所示:

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;
            }
        },
    });
});

我不喜欢使用 HTTPResponseHeader 代替 cookie,我认为它是为此用途而设计的,所以请提出更好的答案。

于 2012-04-05T11:03:29.393 回答
0

您可以使用$.cookie 插件以非常智能的方式处理 cookie,该插件允许您读取、写入和删除 cookie

希望对你有帮助。。

于 2012-06-25T19:18:12.547 回答
0

之前由您发送 HTTP 请求的同一域设置的所有 cookie 都应在您的请求中自动发送,换句话说,所有 cookie 都在 HTTP 请求中自动发送,以便 HTTP 请求前往的域之前设置了该 cookie . 在响应方式中,如果您想在客户端设置 cookie,您可以添加名为“Set-Cookie”的响应标头

于 2012-12-03T17:40:52.387 回答