- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些 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/
我是一名优秀的程序员,十分优秀!