C#调用WebService时插入cookie

 

SOAPUI插入Cookie的方法

 

SOAP插入cookie的方法如下,点击Head,点击加号,然后直接设置就可以了。

 

C#中调用webService时插入Cookie

 

由于调用的时候必须要带上cookie,才能成功获取到数据,而正常的通过引用服务,C#会生成一堆代码,但那只是个空壳子,并没有设置cookie的地方。在网上找了很多资料,最后找到了方法,在此总结一下,以便其他人少走弯路。

 

由于我们是客户端,服务端无法控制,所以网上找到那些设置config,什么启用cookie啊,都是没用的,除非你是正在开发的是服务端+客户端。这里我们主要讨论的是调用方,我只有一个wsdl的地址,服务端不可控制的情况。

 

客户端(web应用)并不会自动发送cookie到wcf。所以客户端还得做更多的工作

 

 

  1. 核心在IClientMessageInspector 这个接口,他有BeforeSendRequest和AfterReceiveReply两个方法。
  2. 我们要新建一个类CookieBehavior.cs

     

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class CookieBehavior : IEndpointBehavior
{
    private string SID { get; set; }
 
    public CookieBehavior(string pSid)
    {
        SID = pSid;
    }
 
    public void Validate(ServiceEndpoint endpoint)
    {
        return;
    }
 
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
        return;
    }
 
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
        return;
    }
 
    public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime behavior)
    {
        behavior.MessageInspectors.Add(new CookieMessageInspector(SID));
    }
}

  

 

  1. 建立一个类CookieMessageInspector,继承IClientMessageInspector,实现他的BeforeSendRequest和AfterReceiveReply两个方法。

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public class CookieMessageInspector : IClientMessageInspector
      {
          private string SID { get; set; }
     
          public CookieMessageInspector(string pSid)
          {
              SID = pSid;
          }
     
          public object BeforeSendRequest(ref Message request, System.ServiceModel.IClientChannel channel)
          {
              var cookie = "SID=" + SID;
     
              HttpRequestMessageProperty httpRequestMessage;
              object httpRequestMessageObject;
     
              if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
              {
                  httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
                  if (string.IsNullOrEmpty(httpRequestMessage.Headers["Cookie"]))
                  {
                      httpRequestMessage.Headers["Cookie"] = cookie;
                  }
              }
              else
              {
                  httpRequestMessage = new HttpRequestMessageProperty();
                  httpRequestMessage.Headers.Add("Cookie", cookie);
                  request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
              }
     
              return null;
          }
     
          public void AfterReceiveReply(ref Message reply, object correlationState)
          {
              return;
               
          }
      }

      

     

     

  2. 通过vs添加服务引用,他会自动生成一个代理类。在new这个代理类之后,加入我们新建的behavior

 

1
2
3
4
WokSearchLiteClient searchLiteClient = new WokSearchLiteClient();
CookieBehavior c = new CookieBehavior(authentKey);
searchLiteClient.Endpoint.Behaviors.Add(c);
var ret = searchLiteClient.search(searchRequest.queryParameters, searchRequest.retrieveParameters);

  

 

这样就完成了,带cookie的webService调用

posted @   JangoJing  阅读(749)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示