【问题标题】:How to set a cookie in WCF and read it in the calling Ajax's success function (or elsewhere)如何在 WCF 中设置 cookie 并在调用 Ajax 的成功函数(或其他地方)中读取它
【发布时间】:2012-04-04 15:35:41
【问题描述】:

我有一些 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?如果是这样,我应该在哪里寻找返回给客户的价值?如果不是,我应该怎么做?

【问题讨论】:

    标签: jquery ajax wcf cookies httpresponse


    【解决方案1】:

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

    Drew Marsh 在 cmets 中向his answer to "WCF -> ASMX and 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,我认为它是为此用途而设计的,所以请提出更好的答案。

    【讨论】:

      【解决方案2】:

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

      希望对你有所帮助..

      【讨论】:

      • 我不确定这是否有帮助 - 在客户端读取和写入 cookie 不是问题所在,而是关于如何在客户端和 WCF 服务器之间传输 cookie 并返回到客户。
      【解决方案3】:

      之前由您发送 HTTP 请求的同一域设置的所有 cookie 应在您的请求中自动发送,换句话说,所有 cookie 都在 HTTP 请求中自动发送,以便设置 HTTP 请求所针对的域之前那个饼干。在响应方式中,如果你想在客户端设置cookie,你可以添加名为“Set-Cookie”的响应头

      【讨论】:

        猜你喜欢
        • 2016-10-29
        • 2012-12-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多