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
    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两个方法。

      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
            WokSearchLiteClient searchLiteClient = new WokSearchLiteClient();
            CookieBehavior c = new CookieBehavior(authentKey);
            searchLiteClient.Endpoint.Behaviors.Add(c);
            var ret = searchLiteClient.search(searchRequest.queryParameters, searchRequest.retrieveParameters);

  

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

时间: 2024-10-25 14:21:09

C#调用WebService时插入cookie的相关文章

动态调用WebService时动态获取返回Class中的属性

直接给代码: var ret = HTTPS.WSHelper.InvokeWebService("WebService URL", "MethodName", object[] args);var type = ret.GetType();var propertyinfo = type.GetProperty("result");if (propertyinfo == null){       throw new Exception("

winform调用webservice时步骤

1添加服务引用---高级----添加web引用------填写url--添加web引用即可完成对webservice的引用 让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务. 如果需要动态调用WebService,要实现这样的功能: public static object InvokeWebService(stringurl,  stringmethodname,object[] args) 其中, url是Web服务的地址, methodname是要调用服务方法名, args

动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法 (转)

本文转自:http://blog.csdn.net/limlimlim/article/details/8647038 [导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS2010里时,发现引用出现错误标志.代码如下: '// 3. 创建客户端代理代理类. ServiceDescriptionImporter importer = new ServiceD

调用webservice时,产生android.os.NetworkOnMainThreadException错误

android.os.NetworkOnMainThreadException 网上搜索后知道是因为版本问题,在4.0之后在主线程里面执行Http请求都会报这个错,也许是怕Http请求时间太长造成程序假死的情况吧.那么网上的朋友也给出了相应的解决方案,这叫上有政策下有对策: 一:在发起Http请求的Activity里面的onCreate函数里面添加如下代码: //详见StrictMode文档 StrictMode.setThreadPolicy(new StrictMode.ThreadPoli

调用webservice异常总结

发布和调用Webservice很简单,但小问题依然不断,特总结如下: 一.Java调用.net的webService产生"服务器未能识别 HTTP 标头 SOAPAction 的值"错误. 解决方案: 调用webservice时,没有指定SoapAction,没有指定RequestNameSpace,所以请求时总是出现"服务器未能识别 HTTP 标头 SOAPAction 的值. 如果使用axis调用,请按以下方式调用: public static void main(Str

动态调用WebService(C#) (非常实用)

前言 站在开发者的角度,WebService 技术确实是不再“时髦”.甚至很多人会说,我们不再用它.当然,为了使软件可以更简洁,更有层次,更易于实现缓存等机制,我是非常建议将 SOAP 转为 RESTful 架构风格的.但到目前为止,WebService 在一些Public Institution 中使用还是十分广泛的. 这里主要讨论一下关于WebService的调用问题.关于WebService 的调用分为静态调用和动态调用两种,外加直接Http请求方式 静态调用 静态调用的方式是通过“Add

C# 动态调用 WebService (转)

通常我们在程序中需要调用WebService时,都是通过"添加Web引用",让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名.参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制.如果哪一天发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译.在某些情况下,这可能是不能忍受的,我们需要动态调用WebService的能力.比如我们可以把Web服务的URL保存在配置文件中,

jQuery调用WebService返回JSON数据

相信大家都比较了解JSON格式的数据对于ajax的方便,不了解的可以从网上找一下这方面的资料来看一下,这里就不多说了,不清楚的可以在网上查一下,这里只说一下因为参数设置不当引起的取不到返回值的问题. 在用jQuery调用WebService的时候,它contentType默认为 以下是WebService服务端的代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.W

C#中Winform动态调用Webservice的方法(转)

一般情况下winform调用webservice时步骤 1添加服务引用---高级----添加web引用------填写url--添加web引用即可完成对webservice的引用 让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务. 如果需要动态调用WebService,要实现这样的功能: publicstaticobjectInvokeWebService(stringurl,  stringmethodname,object[] args) 其中,url是Web服务的地址,me