Robin's Blog

记录 积累 学习 成长

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

7.4.4  案例演示:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务(1)

通过上面的介绍,我们对WCF两种基于IIS的寄宿模式有了一个清晰的认识,并对基于ASP.NET兼容模式下的编程有了一个大致的了解。现在,我们通过一个具体的案例进一步加深读者对ASP.NET兼容模式的理解。

由于在ASP.NET兼容模式下,ASP.NET采用与.aspx Page完全一样的方式处理基于.svc的请求,换言之,我们就可以借助当前HttpContext的SessionState维护会话状态,进而创建一个支持会话的WCF Service。和上面的一个案例一样,本案例采用如图7-20所示的3层结构。

 
(点击查看大图)图7-20  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.     }  

步骤二  实现服务: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.  
  5. [AspNetCompatibilityRequirements(  
  6. RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]  
  7. public class CalculatorService:ICalculator  
  8. {  
  9.     public void Add(double x)  
  10.     {  
  11.         HttpContext.Current.Session["__Result"] = GetResult() + x;  
  12.     }  
  13.  
  14.     public void Subtract(double x)  
  15.     {  
  16.         HttpContext.Current.Session["__Result"] = GetResult() - x;  
  17.     }  
  18.  
  19.     public void Multiply(double x)  
  20.     {  
  21.         HttpContext.Current.Session["__Result"] = GetResult() * x;  
  22.     }  
  23.  
  24.     public void Divide(double x)  
  25.     {  
  26.         HttpContext.Current.Session["__Result"] = GetResult() / x;  
  27.     }  
  28.  
  29.     public double GetResult()  
  30.     {  
  31.         if (HttpContext.Current.Session["__Result"] == null)  
  32.         {  
  33.             HttpContext.Current.Session["__Result"] = 0.0;  
  34.         }  
  35.         return (double)HttpContext.Current.Session["__Result"];          
  36.     }  

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

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

 

posted on 2011-01-26 16:47  Robin99  阅读(276)  评论(0编辑  收藏  举报