一般来说,web应用的服务端(aspx或mvc的action)调用wcf时,是一个服务与服务的通讯,而不是客户端(浏览器)与服务器的通讯。

这种情况下,如果要在wcf端处理客户端的cookie,就需要做一些额外的开发。

首先,在wcf的web.config里,需要启用

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

之后,wcf的实现类需要加attribute

[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]

做完上面的两步,在wcf具体的方法里就可以使用HttpContext.Current .Resposne/.Request来读写cookie了。

 

但是,正如上面所说,这是一个服务器与服务器的通讯,客户端(web应用)并不会自动发送cookie到wcf。所以客户端还得做更多的工作

 

核心在IClientMessageInspector 这个接口,他有

BeforeSendRequest和AfterReceiveReply两个方法。

我们的目的是在beforeSendRequest时,在请求中加入cookie信息,在AfterReciveReply方法中,从响应中获取要设置的cookie,并真正设置到客户端(浏览器)

public class CookieMessageInspector : IClientMessageInspector
新建一个类,来实现接口
   1: public object BeforeSendRequest(ref Message request,System.ServiceModel.IClientChannel channel)

   2: {

   3:     var cookie = GetCookieValue();

   4:  

   5:     HttpRequestMessageProperty httpRequestMessage;

   6:     object httpRequestMessageObject;

   7:  

   8:     if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))

   9:     {

  10:         httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;

  11:         if (string.IsNullOrEmpty(httpRequestMessage.Headers["Cookie"]))

  12:         {

  13:             httpRequestMessage.Headers["Cookie"] = cookie;

  14:         }

  15:     }

  16:     else

  17:     {

  18:         httpRequestMessage = new HttpRequestMessageProperty();

  19:         httpRequestMessage.Headers.Add("Cookie", cookie);

  20:         request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);

  21:     }

  22:  

  23:     return null;

  24: }

我们需要把cookie值,转化成字符串进行传递,cookie名=cookie值这样的形式,多个cookie用分号(;)分隔。

我们新建的这个类,要如何使用呢,他需要在一个behavior中调用。所以我们还得建立一个behavior

public class CookieBehavior : IEndpointBehavior

实现接口IEndpointBehavior,并且在方法ApplyClientBehavior中加入我们刚才的类

public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint,ClientRuntime behavior)
{
behavior.MessageInspectors.Add(new CookieMessageInspector());
}

其他需要实现的方法,直接return即可

 

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

var client = new TestSvc.TestSvcClient();
CookieBehavior b = new CookieBehavior();
client.Endpoint.Behaviors.Add(b);

之后,我们调用方法,就会把cookie信息传递到wcf了。

 

到目前为止,我们可以解决web向wcf传递当前cookie,wcf可以读取cookie。

下面我们解决在wcf中设置cookie。

同样的原理,在读取的时候,我们是在BeforeSendRequest中实现的,那写入则需要在AfterReceiveReply中实现了。

在wcf中使用

HttpContext.Current.Response.Cookies.Add(new HttpCookie("test123", "123"));

类似这样的代码设置cookie,他在响应的header里会有Set-Cookie,我们只需要处理Set-Cookie里面的内容就可以了。

在写入多个cookie时,与读操作不同,这里是用逗号(,)分隔的,并且默认他会带cookie的path,如果你设置了cookie的domain,过期时间等,他也会传递,并且同一个cookie的若干属性之间是用分号(;)分隔的

   1: public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply,object correlationState)

   2: {

   3:     if (reply.Properties.ContainsKey("httpResponse"))

   4:     {

   5:         HttpResponseMessageProperty httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty;

   6:  

   7:         if (httpResponse != null)

   8:         {

   9:             string cookie = httpResponse.Headers.Get("Set-Cookie");

  10:             if (!string.IsNullOrEmpty(cookie))

  11:             {

  12:                 //解析并设置cookie

  13:             }

  14:         }

  15:     }

  16: }

具体如何解析,就是字符串操作,就不细说了。

 

以上方式可以实现web应用的服务器端与wcf通讯时,附带客户端(浏览器)的cookie信息,进行读写操作。

但是每次都需要对client进行设置,相对比较麻烦。我们可以通过web.config中的配置来让client自动加入behavior。

同样,我们需要下面这样的一个类

public class CookieBehaviorExtensionElement :BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new CookieBehavior();
} public override Type BehaviorType
{
get { return typeof(CookieBehavior); }
}
}

之后,在web项目的web.config中

<system.serviceModel>

此节点下,首先需要加入

<extensions>
<behaviorExtensions>
<add name="CookieBehavior" type="webhost.CookieBehaviorExtensionElement, webhost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
注意type是的写法,需要根据自己项目的命名空间来进行修改
之后
<behaviors>
<endpointBehaviors>
<behavior name="CookieBehaviorConfig">
<CookieBehavior />
</behavior>
</endpointBehaviors>
</behaviors>
黄色部分,为extensions中我们添加的那条的name

最后

<endpoint address="http://localhost:5351/testSvc.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ITestSvc" contract="TestSvc.ITestSvc"
name="BasicHttpBinding_ITestSvc" behaviorConfiguration="CookieBehaviorConfig" />
设置endpoint的behaviorConfiguration为behaviors节中添加的behavior的name
 
如此,我们就可以不用每次new client之后在去设置它的behavior了

wcf读写cookie的更多相关文章

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

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

  2. JS读写cookie以及中文乱码解决

    本文地址:http://www.cnblogs.com/PiaoMiaoGongZi/p/4092489.html 转载请注明. Js获取所有的cookie信息: var cookiename = d ...

  3. JS读写Cookie(设置、读取、删除)

    JS读写Cookie(设置.读取.删除) Cookie是客户端存放数据的一种方式,可用来做状态保持. 1.设置Cookie: a.无过期时间:(若不设置过期时间,默认为会话级Cookie,浏览器关闭就 ...

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

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

  5. Java中如何读写cookie (二)

    Java中删除cookie Cookie[]   cookies=request.getCookies();       //cookies不为空,则清除       if(cookies!=null ...

  6. 两种方法使用js读写cookie实现一个底部广告浮层效果

    下面一个案例实现了js实现一个页面浮层并且使用两种方法使用js读写cookie:来实现用户关闭广告的显示状态: 读者可以将下面代码复制到一个html文件试试效果:html的pre标签未两种js实现的方 ...

  7. js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总

    在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要.   什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...

  8. WCF基于Cookie回传的系列(概述)

    1  WCF的基本知识(不作细述,园子里有很多的经典的文章系列) 2 WCF的执行过程 3 让服务通信像浏览器发送请求应答一样回传Cookie,并实现Cookie在不同的服务间共享 4  基于共享后的 ...

  9. 转:JQuery读写Cookie

    Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术.当你浏览某网站时,你硬盘上会生产一个非常小的文本文件,它可以记录你的用户ID.密码.浏览过 ...

随机推荐

  1. 避免图片路径访问405,可以用图片控件来显示局部相对路径,不需要域名就不会出现jpg静态资源访问错误

    <asp:Image ID="Image1" runat="server"/> protected void Page_Load(object se ...

  2. WorkSpace

    --往GridControl中添加绑定数据 // 房间费用 DataTable dtRoomInfo = new DataTable(); dtRoomInfo.Columns.Add("v ...

  3. 我所理解的网络游戏<一>:网游的顶层设计

    网游的基本结构 各大模块的基本功能如下 · 服务器端 登陆服:处理新建玩家.登陆逻辑. 场景服:处理场景服中的逻辑. 中心服:处理跨服的逻辑,实现不同场景服进程的数据调度,以及向数据库查询数据. 数据 ...

  4. 知物由学 | AI时代,那些黑客正在如何打磨他们的“利器”?(一)

    本文由  网易云发布. “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道.“知物由学” ...

  5. day 57 Bootstrap 第一天

    一 .bootstrap是什么  http://v3.bootcss.com/css/#grid-options(参考博客) 是一个前端开发的框架. HTML CSS JS 下载地址:https:// ...

  6. Systemd 服务管理器

    博文链接:http://www.cnblogs.com/zhenghongxin/p/8672199.html 项目中遇到有些脚本需要通过后台进程运行,保证不被异常中断,变成守护进程的第一步,就是把它 ...

  7. python 爬图 helloworld

    最近发现 吾志 上用户的头像都很个性,另外,对于没有把日记设为私密的用户,最后一天的日记是公开的,谁都可以查看. 所以,如果每天把所有可查看的日记爬一遍,那么-- 哈哈 以前对爬虫只是了解一点点,没有 ...

  8. javaweb+spring 项目集成异常的处理

    在web项目开发中,一个系统应该要考虑到异常情况的处理,并且应该当异常发生时应该需要记录相应的异常日志,对于用户而言则不能直接抛出异常,需要考虑到用户的体验: 以下就介绍基于spring框架的基础上的 ...

  9. Linux CentOS7系统中mysql8安装配置

    mysql是世界上最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司所有.今天我将记录一下如何在Linux centos7系统上安装和配置MySQL. 目录 环境准 ...

  10. Matlab 编程

    M文件 1. 脚本文件 Script is a file containing a series of commands Scripts need to be saved to a <file& ...