化零为整WCF(10) - 实例模型(InstanceContextMode)

简介:
[索引页]
[源码下载] 


化零为整WCF(10) - 实例模型(InstanceContextMode)


作者: webabcd


介绍
WCF(Windows Communication Foundation) - 实例模型:
    ServiceBehavior
    ·InstanceContextMode.PerCall - 新的 System.ServiceModel.InstanceContext 对象在每次调用前创建,在调用后回收。
    ·InstanceContextMode.PerSession - 为每个会话创建一个新的 System.ServiceModel.InstanceContext 对象。
    ·InstanceContextMode.Single - 只有一个 System.ServiceModel.InstanceContext 对象用于所有传入呼叫,并且在调用后不回收。如果服务对象不存在,则创建一个。



示例
1、服务
PerCallMode.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
using System.ServiceModel; 
 
namespace WCF.ServiceLib.InstanceMode 

         /// <summary> 
         /// 演示实例模型的接口(PerCall) 
         /// </summary> 
        [ServiceContract] 
         public  interface IPerCallMode 
        { 
                 /// <summary> 
                 /// 获取计数器结果 
                 /// </summary> 
                 /// <returns></returns> 
                [OperationContract] 
                 int Counter(); 
        } 
 
         /// <summary> 
         /// 演示实例模型的类(PerCall) 
         /// </summary> 
         /// <remarks> 
        /// InstanceContextMode - 获取或设置指示新服务对象何时创建的值。 
        /// InstanceContextMode.PerCall - 新的 System.ServiceModel.InstanceContext 对象在每次调用前创建,在调用后回收。 
        /// </remarks> 

        [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
         public  class PerCallMode : IPerCallMode 
        { 
                 private  int _counter; 
 
                 /// <summary> 
                 /// 获取计数器结果 
                 /// </summary> 
                 /// <returns></returns> 
                 public  int Counter() 
                { 
                        _counter++; 
 
                         return _counter; 
                } 
        } 
}
 
PerSessionMode.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
using System.ServiceModel; 
 
namespace WCF.ServiceLib.InstanceMode 

         /// <summary> 
         /// 演示实例模型的接口(PerSession) 
         /// </summary> 
        [ServiceContract()] 
         public  interface IPerSessionMode 
        { 
                 /// <summary> 
                 /// 获取计数器结果 
                 /// </summary> 
                 /// <returns></returns> 
                [OperationContract] 
                 int Counter(); 
        } 
 
         /// <summary> 
         /// 演示实例模型的类(PerCall) 
         /// </summary> 
         /// <remarks> 
        /// InstanceContextMode - 获取或设置指示新服务对象何时创建的值。 
        /// InstanceContextMode.PerSession - 为每个会话创建一个新的 System.ServiceModel.InstanceContext 对象。 
        /// InstanceContextMode 的默认值为 InstanceContextMode.PerSession 
        /// </remarks> 

        [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
         public  class PerSessionMode : IPerSessionMode 
        { 
                 private  int _counter; 
 
                 /// <summary> 
                 /// 获取计数器结果 
                 /// </summary> 
                 /// <returns></returns> 
                 public  int Counter() 
                { 
                        _counter++; 
 
                         return _counter; 
                } 
        } 
}
 
SingleMode.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
using System.ServiceModel; 
 
namespace WCF.ServiceLib.InstanceMode 

         /// <summary> 
         /// 演示实例模型的接口(Single) 
         /// </summary> 
        [ServiceContract] 
         public  interface ISingleMode 
        { 
                 /// <summary> 
                 /// 获取计数器结果 
                 /// </summary> 
                 /// <returns></returns> 
                [OperationContract] 
                 int Counter(); 
        } 
 
         /// <summary> 
         /// 演示实例模型的接口(Single) 
         /// </summary> 
         /// <remarks> 
        /// InstanceContextMode - 获取或设置指示新服务对象何时创建的值。 
        /// InstanceContextMode.Single - 只有一个 System.ServiceModel.InstanceContext 对象用于所有传入呼叫,并且在调用后不回收。如果服务对象不存在,则创建一个。 
        /// </remarks> 

        [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
         public  class SingleMode : ISingleMode 
        { 
                 private  int _counter; 
 
                 /// <summary> 
                 /// 获取计数器结果 
                 /// </summary> 
                 /// <returns></returns> 
                 public  int Counter() 
                { 
                        _counter++; 
 
                         return _counter; 
                } 
        } 
}
 
 
2、宿主
PerCallMode.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.InstanceMode.PerCallMode" %>
 
PerSessionMode.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.InstanceMode.PerSessionMode" %>
 
SingleMode.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.InstanceMode.SingleMode" %>
 
Web.config
<?xml version="1.0"?> 
<configuration> 
        <system.serviceModel> 
                <behaviors> 
                        <serviceBehaviors> 
                                <behavior name="InstanceModeBehavior"> 
                                        <!--httpGetEnabled - 使用get方式提供服务--> 
                                        <serviceMetadata httpGetEnabled="true" /> 
                                        <serviceDebug includeExceptionDetailInFaults="true"/> 
                                </behavior> 
                        </serviceBehaviors> 
                </behaviors> 
                <services> 
                        <!--name - 提供服务的类名--> 
                        <!--behaviorConfiguration - 指定相关的行为配置--> 
                        <service name="WCF.ServiceLib.InstanceMode.PerCallMode" behaviorConfiguration="InstanceModeBehavior"> 
                                <!--address - 服务地址--> 
                                <!--binding - 通信方式--> 
                                <!--contract - 服务契约--> 
                                <endpoint address="" binding="basicHttpBinding" contract="WCF.ServiceLib.InstanceMode.IPerCallMode" /> 
                        </service> 
                        <service name="WCF.ServiceLib.InstanceMode.PerSessionMode" behaviorConfiguration="InstanceModeBehavior"> 
                                <!--bindingConfiguration - 指定相关的绑定配置--> 
                                <endpoint address="" binding="wsHttpBinding" contract="WCF.ServiceLib.InstanceMode.IPerSessionMode" bindingConfiguration="PerSessionModeBindingConfiguration"/> 
                        </service> 
                        <service name="WCF.ServiceLib.InstanceMode.SingleMode" behaviorConfiguration="InstanceModeBehavior"> 
                                <endpoint address="" binding="basicHttpBinding" contract="WCF.ServiceLib.InstanceMode.ISingleMode" /> 
                        </service> 
                </services> 
                <bindings> 
                        <wsHttpBinding> 
                                <!--wsHttpBinding 可提供 安全会话 和 可靠会话--> 
                                <binding name="PerSessionModeBindingConfiguration"> 
                                        <!--指示是否在通道终结点之间建立 WS-RM (WS-ReliableMessaging) 可靠会话。默认值为 false。--> 
                                        <reliableSession enabled="true"/> 
                                        <security> 
                                                <!--此属性控制安全上下文令牌是否通过客户端与服务之间的 WS-SecureConversation 交换建立。将它设置为 true 要求远程方支持 WS-SecureConversation。--> 
                                                <message establishSecurityContext="true"/> 
                                        </security> 
                                </binding> 
                        </wsHttpBinding> 
                </bindings> 
        </system.serviceModel> 
</configuration>
 
 
3、客户端
Hello.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Hello.aspx.cs" 
        Inherits="InstanceMode_Hello" Title="实例模型(InstanceContextMode)" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
        <asp:Button ID="btnPerCallMode" runat="server" Text="PerCallMode"    
                 /> 
          
        <asp:Button ID="btnPerSessionMode" runat="server" Text="PerSessionMode"    
                 /> 
          
        <asp:Button ID="btnSingleMode" runat="server" Text="SingleMode"    
                 /> 
</asp:Content>
 
Hello.aspx.cs
using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Linq; 
 
public partial  class InstanceMode_Hello : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
 
        } 
 
         protected  void btnPerCallMode_Click( object sender, EventArgs e) 
        { 
 
                var proxy =  new InstanceModeSvc.PerCallMode.PerCallModeClient(); 
 
                Page.ClientScript.RegisterStartupScript( 
                         this.GetType(), 
                         "js"
                         string.Format( "alert('计数器:{0}')", proxy.Counter()), 
                         true); 
 
                proxy.Close(); 
        } 
 
         protected  void btnPerSessionMode_Click( object sender, EventArgs e) 
        { 
                 if (Session[ "proxy"] ==  null
                        Session[ "proxy"] =  new InstanceModeSvc.PerSessionMode.PerSessionModeClient(); 
 
                Page.ClientScript.RegisterStartupScript( 
                         this.GetType(), 
                         "js"
                         string.Format( "alert('计数器:{0}')", (Session[ "proxy"as InstanceModeSvc.PerSessionMode.PerSessionModeClient).Counter()), 
                         true); 
        } 
 
         protected  void btnSingleMode_Click( object sender, EventArgs e) 
        { 
                var proxy =  new InstanceModeSvc.SingleMode.SingleModeClient(); 
 
                Page.ClientScript.RegisterStartupScript( 
                         this.GetType(), 
                         "js"
                         string.Format( "alert('计数器:{0}')", proxy.Counter()), 
                         true); 
 
                proxy.Close(); 
        } 
}
 
Web.config
<?xml version="1.0"?> 
<configuration> 
        <system.serviceModel> 
                <client> 
                        <!--address - 服务地址--> 
                        <!--binding - 通信方式--> 
                        <!--contract - 服务契约--> 
                        <endpoint address="http://localhost:3502/ServiceHost/InstanceMode/PerCallMode.svc" binding="basicHttpBinding" contract="InstanceModeSvc.PerCallMode.IPerCallMode" /> 

                        <!--bindingConfiguration - 指定相关的绑定配置--> 
                        <endpoint address="http://localhost:3502/ServiceHost/InstanceMode/PerSessionMode.svc" binding="wsHttpBinding" contract="InstanceModeSvc.PerSessionMode.IPerSessionMode" bindingConfiguration="PerSessionModeBindingConfiguration" /> 

                        <endpoint address="http://localhost:3502/ServiceHost/InstanceMode/SingleMode.svc" binding="basicHttpBinding" contract="InstanceModeSvc.SingleMode.ISingleMode" /> 
                </client> 
                <bindings> 
                        <wsHttpBinding> 
                                <binding name="PerSessionModeBindingConfiguration"> 
                                        <!--指示是否在通道终结点之间建立 WS-RM (WS-ReliableMessaging) 可靠会话。默认值为 false。--> 
                                        <reliableSession enabled="true"/> 
                                        <security> 
                                                <!--此属性控制安全上下文令牌是否通过客户端与服务之间的 WS-SecureConversation 交换建立。将它设置为 true 要求远程方支持 WS-SecureConversation。--> 
                                                <message establishSecurityContext="true"/> 
                                        </security> 
                                </binding> 
                        </wsHttpBinding> 
                </bindings> 
        </system.serviceModel> 
</configuration>
 
运行结果:
单击"btnPerCallMode"按钮,每次单击,计数器都返回1
单击"btnPerSessionMode"按钮,每次单击并且会话相同,计数器会累加
单击"btnSingleMode"按钮,每次单击,计数器都累加


OK
[源码下载]
 


     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/344149 ,如需转载请自行联系原作者

相关文章
|
Web App开发 .NET 测试技术
.net WCF简单实例
  最近看到网上招聘有许多都需要WCF技术的人员,我之前一直没接触过这个东西,以后工作中难免会遇到,所谓笨鸟先飞,于是我就一探究竟,便有了这边文章。由于是初学WCF没有深入研究其原理,只是写了一个demo留着以后,如果哪里写的不对希望大佬们能指出批评。
1061 0
|
.NET 开发框架 数据安全/隐私保护
下一篇
无影云桌面