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方法获得。
- using System.ServiceModel;
- namespace Artech.AspCompatibleServices.Contracts
- {
- [ServiceContract]
- public interface ICalculator
- {
- [OperationContract]
- void Add(double x);
- [OperationContract]
- void Subtract(double x);
- [OperationContract]
- void Multiply(double x);
- [OperationContract]
- void Divide(double x);
- [OperationContract]
- double GetResult();
- }
- }
步骤二 实现服务:CalculatorService
服务的实现和.svc都定义在一个ASP.NET Web站点项目中。对于定义在 CalculatorService中的每次运算,先通过HttpContext从SessionState中取出上一次运算的结果,完成运算后再将新的运算结果保存到SessionState中。通过在CalculatorService上应用AspNetCompatibilityRequirementsAttribute实现对ASP.NET兼容模式的支持。
- using System.ServiceModel.Activation;
- using System.Web;
- using Artech.AspCompatibleServices.Contracts;
-
- [AspNetCompatibilityRequirements(
- RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class CalculatorService:ICalculator
- {
- public void Add(double x)
- {
- HttpContext.Current.Session["__Result"] = GetResult() + x;
- }
-
- public void Subtract(double x)
- {
- HttpContext.Current.Session["__Result"] = GetResult() - x;
- }
-
- public void Multiply(double x)
- {
- HttpContext.Current.Session["__Result"] = GetResult() * x;
- }
-
- public void Divide(double x)
- {
- HttpContext.Current.Session["__Result"] = GetResult() / x;
- }
-
- public double GetResult()
- {
- if (HttpContext.Current.Session["__Result"] == null)
- {
- HttpContext.Current.Session["__Result"] = 0.0;
- }
- return (double)HttpContext.Current.Session["__Result"];
- }
- }
下面是CalculatorService对应的.svc的定义和Web.config。为了简洁,在<@ServiceHost%>指令中,仅仅设置一个必需属性Service。对于ASP.NET兼容模式的支持,配置<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>必不可少。
- <%@ ServiceHost Service="CalculatorService" %>
- <?xml version="1.0"?>
- <configuration>
- <system.serviceModel>
- <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
- <services>
- <service name="CalculatorService">
- <endpoint binding="wsHttpBinding" contract="Artech.
- AspCompatibleServices.Contracts.ICalculator" />
- </service>
- </services>
- </system.serviceModel>
- </configuration>
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方法获得。
- using System.ServiceModel;
- namespace Artech.AspCompatibleServices.Contracts
- {
- [ServiceContract]
- public interface ICalculator
- {
- [OperationContract]
- void Add(double x);
- [OperationContract]
- void Subtract(double x);
- [OperationContract]
- void Multiply(double x);
- [OperationContract]
- void Divide(double x);
- [OperationContract]
- double GetResult();
- }
- }
步骤二 实现服务:CalculatorService
服务的实现和.svc都定义在一个ASP.NET Web站点项目中。对于定义在 CalculatorService中的每次运算,先通过HttpContext从SessionState中取出上一次运算的结果,完成运算后再将新的运算结果保存到SessionState中。通过在CalculatorService上应用AspNetCompatibilityRequirementsAttribute实现对ASP.NET兼容模式的支持。
- using System.ServiceModel.Activation;
- using System.Web;
- using Artech.AspCompatibleServices.Contracts;
- [AspNetCompatibilityRequirements(
- RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class CalculatorService:ICalculator
- {
- public void Add(double x)
- {
- HttpContext.Current.Session["__Result"] = GetResult() + x;
- }
- public void Subtract(double x)
- {
- HttpContext.Current.Session["__Result"] = GetResult() - x;
- }
- public void Multiply(double x)
- {
- HttpContext.Current.Session["__Result"] = GetResult() * x;
- }
- public void Divide(double x)
- {
- HttpContext.Current.Session["__Result"] = GetResult() / x;
- }
- public double GetResult()
- {
- if (HttpContext.Current.Session["__Result"] == null)
- {
- HttpContext.Current.Session["__Result"] = 0.0;
- }
- return (double)HttpContext.Current.Session["__Result"];
- }
- }
下面是CalculatorService对应的.svc的定义和Web.config。为了简洁,在<@ServiceHost%>指令中,仅仅设置一个必需属性Service。对于ASP.NET兼容模式的支持,配置<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>必不可少。
- <%@ ServiceHost Service="CalculatorService" %>
- <?xml version="1.0"?>
- <configuration>
- <system.serviceModel>
- <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
- <services>
- <service name="CalculatorService">
- <endpoint binding="wsHttpBinding" contract="Artech.
- AspCompatibleServices.Contracts.ICalculator" />
- </service>
- </services>
- </system.serviceModel>
- </configuration>