2012-04-04 16 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」

相關問題