在《基于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
,以便于您获取更多的相关知识。