public class CookieBehavior:IEndpointBehavior
{ private string _cookie; #region 构造函数 重载+2 public CookieBehavior() { } public CookieBehavior(string cookie)
{
_cookie = cookie;
} #endregion #region 接口成员 #region 未实现的接口成员,调用将抛异常
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
} public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
} public void Validate(ServiceEndpoint endpoint)
{
}
#endregion #region 在终结点范围内实现客户端的修改或扩展
/// <summary>
/// 在终结点范围内实现客户端的修改或扩展
/// </summary>
/// <param name="endpoint">要自定义的终结点</param>
/// <param name="clientRuntime">要自定义的客户端运行时</param>
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
SharedCookieMessageInspector insperctor = new SharedCookieMessageInspector(_cookie);
//客户的运行时的消息检查器集合加入自定义的消息检查器
clientRuntime.MessageInspectors.Add(insperctor);
}
#endregion #endregion

实现cookieBehavior类继承IEndpointBehavior接口,为ChnnelFactory添加行为

factory.Endpoint.Behaviors.Add(behavior);

public class SharedCookieMessageInspector:IClientMessageInspector
{
public static string soapCookie;//存储服务端返回的cookie值 #region 构造函数 public SharedCookieMessageInspector(string cookie)
{
//赋值属性
soapCookie = cookie;
}
#endregion #region 实现接口成员 #region 在将请求消息发送到服务之前,启用消息的检查或修改
/// <summary>
/// 在将请求消息发送到服务之前,向消息中写入cookie
/// </summary>
/// <param name="request">要发送给服务的消息</param>
/// <param name="channel">客户端对象通道</param>
/// <returns>唯一状态</returns>
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
string cookie = CookieMe.GetCookie();
HttpRequestMessageProperty reqMessage;
object httpRequestMessageObject;
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
{
reqMessage = httpRequestMessageObject as HttpRequestMessageProperty;
if (string.IsNullOrEmpty(reqMessage.Headers["Cookie"]))
{
reqMessage.Headers["Cookie"] = cookie;
}
}
else
{
reqMessage = new HttpRequestMessageProperty();
reqMessage.Headers.Add("Cookie",cookie);
request.Properties.Add(HttpRequestMessageProperty.Name,reqMessage);
} return null;//不使用相关状态,则为null
}
#endregion #region 在收到回复消息之后将它传递回客户端应用程序之前,启用消息的检查或修改
/// <summary>
/// 在收到回复消息之后,存储 cookie。
/// </summary>
/// <param name="reply">要转换为类型并交回给客户端应用程序的消息</param>
/// <param name="correlationState">关联状态数据</param>
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
//提供对http响应的访问,以便访问和响应为 HTTP 协议请求提供的附加信息
HttpResponseMessageProperty httpResponse =
reply.Properties[HttpResponseMessageProperty.Name] as HttpResponseMessageProperty;
if (httpResponse != null)
{
soapCookie = httpResponse.Headers["Set-Cookie"];//从服务端响应消息头中提取cookie
if (!string.IsNullOrEmpty(soapCookie))
{
CookieMe.SaveCookie(soapCookie);
} } } #endregion #endregion }

wcf客户端 cookie的更多相关文章

  1. WCF 基于Cookie的登录验证回传问题的解决

    参考资料: http://www.cnblogs.com/czcz1024/p/3333138.html http://megakemp.com/2009/02/06/managing-shared- ...

  2. WCF常见问题(1) -- WebService/WCF Session Cookie

    原文:WCF常见问题(1) -- WebService/WCF Session Cookie 在.net 3.0推出WCF之前使用的WebService,有的应用有使用Session保持一些信息,在不 ...

  3. 终于解决:升级至.NET 4.6.1后VS2015生成WCF客户端代理类的问题

    在Visual Studio 2015中将一个包含WCF引用的项目的targetFramework从4.5改为4.6.1的时候,VS2015会重新生成WCF客户端代理类.如果WCF引用配置中选中了&q ...

  4. nginx负载均衡之基于客户端cookie的会话保持

    通过ip_hash做会话保持有一定的缺陷,这个是通过客户端ip来实现.同一个网络下众多客户端访问服务器会被扔到同一台机器,再或者是CDN也 会导致负载不均衡.所以要实现通过客户端cookie实现,包括 ...

  5. WCF初探-10:WCF客户端调用服务

    创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...

  6. WCF初探-11:WCF客户端异步调用服务

    前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...

  7. WCF初探-12:WCF客户端异常处理

    前言: 当我们打开WCF基础客户端通道(无论是通过显式打开还是通过调用操作自动打开).使用客户端或通道对象调用操作,或关闭基础客户端通道时,都会在客户端应用程序中出现异常.而我们知道WCF是基于网络的 ...

  8. WCF初探-13:WCF客户端为双工服务创建回调对象

    前言: 在WCF初探-5:WCF消息交换模式之双工通讯(Duplex)博文中,我讲解了双工通信服务的一个应用场景,即订阅和发布模式,这一篇,我将通过一个消息发送的例子讲解一下WCF客户端如何为双工服务 ...

  9. 生产WCF客户端类文件的命令格式

    生产WCF客户端类文件的命令格式: svcutil.exe net.tcp://127.0.0.1:8732/ChromaMI.Remote.ConfigService/RemoteConfigSer ...

随机推荐

  1. 全国计算机等级考试二级教程-C语言程序设计_第10章_字符串

    字符型指针数组 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //参数中,int a ...

  2. html表格单元格设置背景颜色

  3. javascript第八课匿名函数的使用

    window.onload=function(){ //当窗体载入完成之后执行方法里的内容 document.getElementById("html标签id").onclick= ...

  4. Conscription

    Conscription Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total ...

  5. html系列教程--article audio

    <article> 标签 <article> 标签规定独立的自包含内容.一篇文章应有其自身的意义,应该有可能独立于站点的其余部分对其进行分发. <article> ...

  6. android入门——数据存储

    首先是SharedPreferences 用户偏好 package com.example.wkp.aboutdata; import android.content.Intent; import a ...

  7. c++中basic_istream::getline()的返回值何时为真

    今天在看primer,17ch中的IO库再探,做课后练习,要求用ifstream.getline(char*, const unsigned, char)读取一个文件,用循环: while(ifs.g ...

  8. Linux学习awk命令

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  9. sqlite3编译与查询

    1.sqlite3 http://www.sqlite.org/ 下载 wget http://www.sqlite.org/2014/sqlite-amalgamation-3080403.zip ...

  10. CSS选择器、优先级和匹配原理

    作为一个Web开发者,掌握必要的前台技术也是很重要的,特别是在遇到一些实际问题的时候.这里给大家列举一个例子: 给一个p标签增加一个类(class),可是执行后该class中的有些属性并没有起作用.通 ...