2011-03-22 68 views
0

問題是WCF客戶端不尊重服務器cookie(不會在下一個請求中設置它)。下面是我如何創建客戶端:WCF REST WebHttpBinding cookie處理

WebChannelFactory<IPostService> factory = new WebChannelFactory<IPostService>(
    new WebHttpBinding() {AllowCookies = true}, 
    new Uri("http://10.6.90.45:8081")); 

_proxy = factory.CreateChannel(); 

設置AllowCookies假也沒有效果。

我現在所做的是寫一個簡單的IClientMessageInspector來在請求之間保存服務器cookie,但我真的不想這樣做,應該有一種方法來以標準方式處理cookie。

我現在使用自定義的檢查,這是工作的預期,但我正在尋找一個「乾淨」的解決方案:

public class CookieInspector : IClientMessageInspector 
    { 
     private string _cookie; 

     public object BeforeSendRequest(ref Message request, IClientChannel channel) 
     { 
     if(_cookie != null && request.Properties.ContainsKey("httpRequest")) 
     { 
      HttpRequestMessageProperty httpRequest = request.Properties["httpRequest"] as HttpRequestMessageProperty; 

      if(httpRequest != null) 
      { 
       httpRequest.Headers["Cookie"] = _cookie; 
      } 
     } 

     return null; 
     } 

     public void AfterReceiveReply(ref Message reply, object correlationState) 
     { 
     if (reply.Properties.ContainsKey("httpResponse")) 
     { 
      HttpResponseMessageProperty httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty; 

      if(httpResponse != null) 
      { 
       string cookie = httpResponse.Headers.Get("Set-Cookie"); 

       if (cookie != null) _cookie = cookie; 
      } 
     } 
     } 
    } 

回答

0

How to add cookie on a HttpTransportBindingElement 看到這個頁面,它有完整的回答你的問題

+0

謝謝,但它並沒有說我什麼都不知道。你必須編寫你自己的IClientMessageDispatcher,這正是我現在使用的。我正在尋找_automatic_ cookie管理,就像在HttpWebRequest中一樣。服務器發送一個cookie,客戶端接受該cookie,並在下一個請求中將其發送回服務器。平常的網絡模式,沒有特別的邏輯。在沒有自定義檢查器的情況下,WCF是可以實現的嗎? – 2011-03-23 16:44:12

+1

我沒有太多關於wcf cookies的知識..我只是在閱讀它。我閱讀這篇文章http://megakemp.wordpress.com/2009/02/06/managing-shared-cookies-in-wcf/可以解決你的問題 – Annie 2011-03-24 11:27:12

0

不知道這是「固定」在更新的.NET版本(我在4.5),或者如果OP有其他問題,使這從工作,但allowCookies設置爲此工作目的。

它正在爲我工​​作....我也有「aspnetcompatabilitymode」設置在服務器上。

<webHttpBinding> 
    <binding name="webHttpEndpointBinding" allowCookies="true"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows"/> 
     </security> 
    </binding> 
    </webHttpBinding>