2012-04-04 15 views
2

我有一些jQuery JavaScript调用一个简单的WCF Web服务。我很容易在JavaScript中设置cookie并将其读取到服务器端。如何在WCF中设置cookie并在调用Ajax的成功函数(或其他地方)中读取它。

这是代码。

客户端(JavaScript):

document.cookie = "father=christmas"; 

服务器端(C#在WCF):

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" 
    } 
} 

但我也想在服务器上设置一个cookie在WCF和阅读在客户端。这是我的代码没有做到这一点。

服务器端(C#在WCF):

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的值(我希望会包含我的“云变量=寂寞“cookie)是

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

(NB我的网页(包括JavaScript)和WCF服务驻留在同一台服务器上所以应该没有跨域问题。)

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

回答

0

我希望这不是答案,但this question有意见。 Jfriend00指出根据this W3 spec getAllResponseHeaders()将返回除Set-Cookie标题外的所有标题。 Dan Tao解释说,虽然浏览器将(可能?)一旦浏览器处理响应后复制cookie信息,直到调用回调被调用后才会发生!丹建议“在完全回调中的某种setTimeout交易”。

另一种可能的选择(我没试过)通过在注释中Drew Marsh建议his answer to "WCF -> ASMX and Cookies"在WCF代码中使用消息检查。

我不愿意设置一个超时(感觉像一个黑客),我发现WCF代码很难跟随消息检查器的一部分逻辑,所以在等待另一个答案时,我要写入响应头本身(而不是一个cookie)在WCF这样的代码:

WebOperationContext.Current.OutgoingResponse.Headers.Add("cloud", "lonely"); 

然后阅读在JavaScript/jQuery的/阿贾克斯完整的处理程序,并把它写到一个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,而我思想是为这种用法设计的,所以请请建议一个更好的答案。

0

你可以使用$.cookie plugin,让您reaad,写,删除cookies

希望可以帮助您一个非常聪明的方式处理饼干..

+1

响应头我不知道帮助 - 读取和写入cookie在客户端上没有问题是什么,而它是关于如何在客户端和服务器WCF并返回给客户端之间传输的cookie。 – dumbledad 2012-06-26 09:49:09

0

由您发送HTTP请求的同一域之前设置好的所有Cookie会自动在您的请求中被发送,换句话说,所有Cookie在HTTP请求中自动发送,使得域的HTTP请求会被之前设置的cookie。响应方式,如果你想设置的Cookie在客户端,你可以添加一个名为“设置Cookie”

相关问题