C#调用WebService时插入cookie
SOAPUI插入Cookie的方法
SOAP插入cookie的方法如下,点击Head,点击加号,然后直接设置就可以了。

C#中调用webService时插入Cookie
由于调用的时候必须要带上cookie,才能成功获取到数据,而正常的通过引用服务,C#会生成一堆代码,但那只是个空壳子,并没有设置cookie的地方。在网上找了很多资料,最后找到了方法,在此总结一下,以便其他人少走弯路。
由于我们是客户端,服务端无法控制,所以网上找到那些设置config,什么启用cookie啊,都是没用的,除非你是正在开发的是服务端+客户端。这里我们主要讨论的是调用方,我只有一个wsdl的地址,服务端不可控制的情况。
客户端(web应用)并不会自动发送cookie到wcf。所以客户端还得做更多的工作
- 核心在IClientMessageInspector 这个接口,他有BeforeSendRequest和AfterReceiveReply两个方法。
- 我们要新建一个类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));
}
}
- 建立一个类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; }
} - 通过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调用
C#调用WebService时插入cookie的更多相关文章
- 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
[导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...
- WinForm客户端调用 WebService时 如何启用Session
WinForm客户端调用 WebService时 如何启用Session 摘自: http://www.cnblogs.com/swtseaman/archive/2011/04/18/2020176 ...
- ABAP调用WebService时日期类型问题
在使用ABAP调用WebService时, 提示CX_SY_CONVERSION_NO_DATE_TIME,意思是日期格式不能转化. 究其原因是ABAP里没有相应的数据类型与WebService描述里 ...
- 调用WebService时加入身份验证,以拒绝未授权的访问
众所周知,WebService是为企业需求提供的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务.但在有些时候的某些应用服务不希望被未授权访问,那么此时我们可以一下几种 ...
- C#:调用webservice时提示对操作的回复消息正文进行反序列化时出错
主要原因webservice返回值的长度超过readerQuotas中的了maxStringContentLength值,造成返回值截断,不完整,反序列化时出错. <readerQuotas m ...
- C#调用webservice 时如何传递实体对象
在webservice端公开一个实体类,然后实例化,赋值,然后再给到webservice,可以实现,但是,即使调用端和service端的实体类完全一致,你也要重新实例化service端的,重新赋值,将 ...
- [转]动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
本文转自:http://blog.csdn.net/limlimlim/article/details/8647038 [导读]ServiceDescriptionImporter是创建Web Ser ...
- 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法 (转)
本文转自:http://blog.csdn.net/limlimlim/article/details/8647038 [导读]ServiceDescriptionImporter是创建Web Ser ...
- 调用webservice时,产生android.os.NetworkOnMainThreadException错误
android.os.NetworkOnMainThreadException 网上搜索后知道是因为版本问题,在4.0之后在主线程里面执行Http请求都会报这个错,也许是怕Http请求时间太长造成程序 ...
随机推荐
- Python用户输入和代码注释
一.用户输入 若你安装的是Python3.x版本,当你在Python IDLE(编辑器) 中输入以下代码: name = input('用户名:') print('Hello',name) 保存并执行 ...
- 字体类形:font-family, font-style
语法:{font-family:字体1,字体2,字体3,...} 作用:调用客户端字体 font-family: "Lantinghei SC","Microsoft Y ...
- 安卓studio导入jra包和so包,百度地图so包加载
导入so包 这个我只接受测试可用的一种方法 第一步:把so包放在libs目录下,可以是文件夹也可以是单独的一个个so文件 然后在src同级的目录下找到build.gradle文件下如下信息 sourc ...
- html页面不显示中文
问题:HTML编辑中文后无法在网页上显示中文 原因:是适用的 Cufon字体包不支持中文造成的. 简单粗暴的解决方法:如果你本来打算是去掉Cufon,可以看一看<如何禁用Cufon功能>. ...
- Mysql了解及安装
1.数据库由两部分来构成的 打开一个连接工具,用工具给MySQL发送命令,实际上是给数据库当中的服务下的命令,在服务当中解析命令,最终将命令转化成对物理库上文件IO的操作. 所以数据库的安装位置有两个 ...
- 编译安装 python 2.7
下载python2.7 Python-2.7.6.tgz 下载链接:http://pan.baidu.com/s/1c0AJDDI 配置./configure 编译make 安装 make insta ...
- Vue的生命周期
1.1.实例生命周期 每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如需要设置数据监听.编译模板.挂载实例到 DOM.在数据变化时更新 DOM 等.同时在这个过程中也会运行一些叫做生命周 ...
- HDU1005 找规律 or 循环点 or 矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=1005 1.一开始就注意到了n的数据范围 <=100 000 000,但是还是用普通的循环做的,自然TLE了 ...
- 【模板小程序】求第n个fibonacci数
//fibonacci,find the nth num. 1 1 2 3 5 8... #include <iostream> using namespace std; int fib( ...
- 使用DateTimeOffset 对xml中的日期时间格式时区进行处理
在日常使用中难免会与XML打交道,其中一个常用的格式就是日期了. 交互的时候通常有下面2种方式 DECLARE @Doc XML=' <R> <T>2018-02-22+08: ...