gpt4 book ai didi

jquery - 如何在WCF中设置cookie并在调用Ajax的成功函数(或其他地方)中读取它

转载 作者:行者123 更新时间:2023-12-01 06:02:23 25 4
gpt4 key购买 nike

我有一些 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 的变量)是

Server: ASP.NET Development Server/10.0.0.0Date: Wed, 04 Apr 2012 15:29:27 GMTX-AspNet-Version: 4.0.30319Content-Length: 17Cache-Control: privateContent-Type: application/json; charset=utf-8Connection: Close

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

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

最佳答案

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

Drew Marsh 建议的另一个可能的选项(我没有尝试过)在his answer to "WCF -> ASMX and Cookies"的评论中就是在WCF代码中使用消息检查器。

我不愿意设置超时(感觉就像黑客),并且我发现 WCF 代码很难用消息检查器部分逻辑来遵循,因此在等待另一个答案时,我将写入响应 header 本身(而不是 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 感到不舒服,我认为 cookie 是为此用途而设计的,所以请建议一个更好的答案。

关于jquery - 如何在WCF中设置cookie并在调用Ajax的成功函数(或其他地方)中读取它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com