WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务

在《基于IIS的WCF服务寄宿(Hosting)实现揭秘》中,我们谈到在采用基于IIS(或者说基于ASP.NET)的WCF服务寄宿中,具有两种截然不同的运行模式:ASP.NET并行(Side by Side)模式和ASP.NET兼容模式。对于前者,WCF通过HttpModule实现了服务的寄宿,而对于后者,WCF的服务寄宿通过一个HttpHandler实现。只有在ASP.NET兼容模式下,我们熟悉的一些ASP.NET机制才能被我们使用,比如通过HttpContext的请求下下文;基于文件或者Url的授权;HttpModule扩展;身份模拟(Impersonation)等。

由于在ASP.NET兼容模式下,ASP.NET采用与.aspx Page完全一样的方式处理基于.svc的请求,换言之,我们就可以借助当前HttpContext的SessionState维护会话状态,进而创建一个支持会话的WCF Service。接下来,我们就通过一个简单的例子,一步步地创建这样的会话服务。本案例采用如图1所示的3层结构。

 

图1 ASP.NET兼容模式案例应用结构

步骤一、定义服务契约:ICalculator

案例依然沿用计算服务的例子,不过通过原来直接与传入操作数并得到运算结果的方式不同,为了体现会话状态的存在,我们将本案例的WCF服务定义成“累积计算服务”:保留上一次运算的结果,并将其作为后续运算的操作数。为此,定义了如下一个接口作为服务契约:前面4个操作代表基本的加、减、乘、除运算,计算结果通过GetResult方法获得。

   1: using System.ServiceModel;   2: namespace Artech.AspCompatibleServices.Contracts   3: {   4:     [ServiceContract]   5:     public interface ICalculator   6:     {   7:         [OperationContract]   8:         void Add(double x);   9:         [OperationContract]  10:         void Subtract(double x);  11:         [OperationContract]  12:         void Multiply(double x);  13:         [OperationContract]  14:         void Divide(double x);  15:         [OperationContract]  16:         double GetResult();  17:     }  18: }

步骤二、实现服务:CalculatorService

服务的实现和.svc都定义在一个ASP.NET Web站点项目中。对于定义在 CalculatorService中的每次运算,先通过HttpContext从SessionState中取出上一次运算的结果,完成运算后再将新的运算结果保存到SessionState中。通过在CalculatorService上应用AspNetCompatibilityRequirementsAttribute实现对ASP.NET兼容模式的支持。

   1: using System.ServiceModel.Activation;   2: using System.Web;   3: using Artech.AspCompatibleServices.Contracts;   4: [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]   5: public class CalculatorService : ICalculator   6: {   7:     public void Add(double x)   8:     {   9:         HttpContext.Current.Session["__Result"] = GetResult() + x;  10:     }  11:     public void Subtract(double x)  12:     {  13:         HttpContext.Current.Session["__Result"] = GetResult() - x;  14:     }  15:     public void Multiply(double x)  16:     {  17:         HttpContext.Current.Session["__Result"] = GetResult() * x;  18:     }  19:     public void Divide(double x)  20:     {  21:         HttpContext.Current.Session["__Result"] = GetResult() / x;  22:     }  23:     public double GetResult()  24:     {  25:         if (HttpContext.Current.Session["__Result"] == null)  26:         {  27:             HttpContext.Current.Session["__Result"] = 0.0;  28:         }  29:         return (double)HttpContext.Current.Session["__Result"];  30:     }  31: }

下面是CalculatorService对应的.svc的定义和Web.config。为了简洁,在<@ServiceHost%>指令中,仅仅设置一个必需属性Service。对于ASP.NET兼容模式的支持,配置<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>必不可少。

   1: <?xml version="1.0"?>   2: <configuration>   3:   <system.serviceModel>   4:     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>   5:     <services>   6:       <service name="CalculatorService">   7:         <endpoint binding="wsHttpBinding" contract="Artech.AspCompatibleServices.Contracts.ICalculator" />   8:       </service>   9:     </services>  10:   </system.serviceModel>  11: </configuration> 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索session
, double
, 服务
, 模式
, 运算
httpcontext
,以便于您获取更多的相关知识。

时间: 2024-12-17 19:09:19

WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务的相关文章

WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用

在完成了对于WCF事务编程(<上篇>.<中篇>.<下篇>)的介绍后,本篇文章将提供一个完整的分布式事务的WCF服务应用,通过本例,读者不仅仅会了解到如何编程实现事务型服务,还会获得其他相关的知识,比如DTC和AS-AT的配置等.本例还是沿用贯通本章的应用场景:银行转帐.我们将会创建一个BankingService服务,并将其中的转帐操作定义成事务型操作.我们先从物理部署的角度来了解一下BankingService服务,以及需要实现怎样的分布式事务. 一.从部署的角度看分

WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码和配置:通过ChannelFactory<TChannel>创建服务代理对象.在这篇文章中,我们采用一种独特的方式进行服务的调用.从本质上讲,我们只要能够创建于服务端相匹配的终结点,就能够实现正常的服务调用.在WCF客户端元数据架构体系中,利用MetadataExchangeClient可以获取服务的元数据,而利用MetadataImporter将获取的元数据导入成Serv

WCF技术剖析之二十九:换种不同的方式调用WCF服务

我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码和配置:通过ChannelFactory<TChannel>创建服务代理对象.在这篇文章中,我们采用一种独特的方式进行服务的调用.从本质上讲,我们只要能够创建于服务端相匹配的终结点,就能够实现正常的服务调用.在WCF客户端元数据架构体系中,利用MetadataExchangeClient可以获取服务的元数据,而利用MetadataImporter将获取的元数据导入成Serv

WCF技术剖析系列文章汇总

WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇] WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇] WCF技术剖析之二十九:换种不同的方式调用WCF服务 WCF技术剖析之二十八:自己动手获取元数据 WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的 WCF技术剖析之二十七: 如何将一个服务发布成WSDL WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇] WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展

WCF技术剖析之八:ClientBase&lt;T&gt;中对ChannelFactory&lt;T&gt;的缓存机制

和传统的分布式远程调用一样,WCF的服务调用借助于服务代理(Service Proxy).而ChannelFactory<T>则是服务代理的创建者.WCF采用基于终结点(Endpoint)服务消费方式:WCF服务通过一个或者多个终结点暴露给潜在的服务消费者,服务的消费中通过与之匹配的终结点与之交互.在客户端,我们具有两种典型的服务代理创建方式,其一是通过诸如SvcUtil.exe这样的工具导入服务的元数据生成相应的服务代理(一个继承自ClientBase<T>的类型)代码和相关配置

WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用

原文:WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML.反之,对于一段给定的基于数据契约的XML,要通过反序列化生成该类型的对象,我们该如何实现这样的场景? 比如下面定义了两个类型Contact和Customer,

[原创-总结]WCF技术剖析系列总结篇

近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直无暇管理自己的Blog.到目前为止<WCF技术剖析(卷1)>的写作暂告一段落,初步预计于下个月由武汉博文视点出版.在<WCF技术剖析>写作期间,对WCF又有了新的感悟,为此以书名开始本人的第三个WCF系列.本系列的目的在于对<WCF技术剖析>的补充,会对书中的一些内容进行展开讲述,同时会囊括很多由于篇幅的原因忍痛割弃的内容. 1.通过一个ASP.NET程序模拟WCF基础架构 本系列的第一篇

WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构

细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直无暇管理自己的Blog.到目前为止<WCF技术剖析(卷1)>的写作暂告一段落,初步预计于下个月由武汉博文视点出版.在<WCF技术剖析>写作期间,对WCF又有了新的感悟,为此以书名开始本人的第三个WCF系列.本系列的目的在于对<WCF技术剖析>的补充,会对书中的一些内容进行展开讲述,同时会囊括很多由于篇幅的原因忍痛割弃的内容. 本系列的第一篇,我

WCF技术剖析之二十七: 如何将一个服务发布成WSDL

[基于WS-MEX的实现](提供模拟程序) 通过<如何将一个服务发布成WSDL[编程篇]>的介绍我们知道了如何可以通过编程或者配置的方式将ServiceMetadataBehavior这样一个服务形式应用到相应的服务上面,从而实现基于HTTP-GET或者WS-MEX的元数据发布机制.那么在WCF内部具体的实现原理又是怎样的呢?相信很多人对此都心存好奇,本篇文章的内容将围绕着这个主题展开. 一. 从WCF分发体系谈起 如果读者想对WCF内部的元数据发布机制的实现原理有一个全面而深入的了解,必须对