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

我有一些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('

Father ' + data.d + ''); }, error: function (jqXHR, textStatus, errorThrown) { $('body').html('

' + textStatus + ': ' + errorThrown + ''); } }); });

然而,xhr的值(我希望变量包含我的’cloud = lonely’cookie)是

服务器:ASP.NET Development Server / 10.0.0.0
日期:2012年4月4日星期三15:29:27 GMT
 X-AspNet-Version:4.0.30319
内容长度:17
缓存控制:私有
 Content-Type:application / json; 字符集= utf-8的
连接:关闭

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

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

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

Drew Marsh在回答“WCF – > ASMX和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('

Father ' + data.d + '<\/p>'); }, error: function (jqXHR, textStatus, errorThrown) { $('body').html('

' + textStatus + ': ' + errorThrown + '<\/p>'); }, complete: function (jqXHR, textStatus) { var cloudsFeeling = jqXHR.getResponseHeader("cloud"); if (cloudsFeeling) { document.cookie = "cloud=" + cloudsFeeling; } }, }); });

我觉得使用HTTPResponseHeader代替cookie是不舒服的,我认为这是专为此用途设计的,所以请提出更好的答案。

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

希望能帮到你……

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