WCF REST WebHttpBinding cookie处理

时间:2011-03-22 15:54:31

标签: wcf

问题是WCF客户端不尊重服务器cookie(不在下一个请求中设置它)。以下是我创建客户端的方法:

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

_proxy = factory.CreateChannel();

设置AllowCookies为false也没有效果。

我现在所做的是编写了一个简单的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;
            }
         }
      }
   }

2 个答案:

答案 0 :(得分:0)

How to add cookie on a HttpTransportBindingElement 看到这个页面它可以完整回答你的问题

答案 1 :(得分:0)

不知道这是在最近的.NET版本中是“修复”的(我是4.5版),或者如果OP有其他问题导致无法正常工作,但allowCookies设置是否可以用于此目的

它对我有用....我也在服务器上设置了“aspnetcompatabilitymode”。

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