天天看點

化零為整WCF(10) - 執行個體模型(InstanceContextMode)

<a href="http://webabcd.blog.51cto.com/1787395/343999" target="_blank">[索引頁]</a>

化零為整WCF(10) - 執行個體模型(InstanceContextMode)

介紹

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 

        /// &lt;summary&gt; 

        /// 示範執行個體模型的接口(PerCall) 

        /// &lt;/summary&gt; 

        [ServiceContract] 

        public interface IPerCallMode 

        { 

                /// &lt;summary&gt; 

                /// 擷取計數器結果 

                /// &lt;/summary&gt; 

                /// &lt;returns&gt;&lt;/returns&gt; 

                [OperationContract] 

                int Counter(); 

        } 

        /// 示範執行個體模型的類(PerCall) 

        /// &lt;remarks&gt; 

        /// InstanceContextMode - 擷取或設定訓示新服務對象何時建立的值。 

        /// InstanceContextMode.PerCall - 新的 System.ServiceModel.InstanceContext 對象在每次調用前建立,在調用後回收。 

        /// &lt;/remarks&gt; 

        [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 

        public class PerCallMode : IPerCallMode 

                private int _counter; 

                public int Counter() 

                { 

                        _counter++; 

                        return _counter; 

                } 

}

PerSessionMode.cs

        /// 示範執行個體模型的接口(PerSession) 

        [ServiceContract()] 

        public interface IPerSessionMode 

        /// InstanceContextMode.PerSession - 為每個會話建立一個新的 System.ServiceModel.InstanceContext 對象。 

        /// InstanceContextMode 的預設值為 InstanceContextMode.PerSession 

        [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 

        public class PerSessionMode : IPerSessionMode 

SingleMode.cs

        /// 示範執行個體模型的接口(Single) 

        public interface ISingleMode 

        /// InstanceContextMode.Single - 隻有一個 System.ServiceModel.InstanceContext 對象用于所有傳入呼叫,并且在調用後不回收。如果服務對象不存在,則建立一個。 

        [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

        public class SingleMode : ISingleMode 

2、宿主

PerCallMode.svc

&lt;%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.InstanceMode.PerCallMode" %&gt;

PerSessionMode.svc

&lt;%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.InstanceMode.PerSessionMode" %&gt;

SingleMode.svc

&lt;%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.InstanceMode.SingleMode" %&gt;

Web.config

&lt;?xml version="1.0"?&gt; 

&lt;configuration&gt; 

        &lt;system.serviceModel&gt; 

                &lt;behaviors&gt; 

                        &lt;serviceBehaviors&gt; 

                                &lt;behavior name="InstanceModeBehavior"&gt; 

                                        &lt;!--httpGetEnabled - 使用get方式提供服務--&gt; 

                                        &lt;serviceMetadata httpGetEnabled="true" /&gt; 

                                        &lt;serviceDebug includeExceptionDetailInFaults="true"/&gt; 

                                &lt;/behavior&gt; 

                        &lt;/serviceBehaviors&gt; 

                &lt;/behaviors&gt; 

                &lt;services&gt; 

                        &lt;!--name - 提供服務的類名--&gt; 

                        &lt;!--behaviorConfiguration - 指定相關的行為配置--&gt; 

                        &lt;service name="WCF.ServiceLib.InstanceMode.PerCallMode" behaviorConfiguration="InstanceModeBehavior"&gt; 

                                &lt;!--address - 服務位址--&gt; 

                                &lt;!--binding - 通信方式--&gt; 

                                &lt;!--contract - 服務契約--&gt; 

                                &lt;endpoint address="" binding="basicHttpBinding" contract="WCF.ServiceLib.InstanceMode.IPerCallMode" /&gt; 

                        &lt;/service&gt; 

                        &lt;service name="WCF.ServiceLib.InstanceMode.PerSessionMode" behaviorConfiguration="InstanceModeBehavior"&gt; 

                                &lt;!--bindingConfiguration - 指定相關的綁定配置--&gt; 

                                &lt;endpoint address="" binding="wsHttpBinding" contract="WCF.ServiceLib.InstanceMode.IPerSessionMode" bindingConfiguration="PerSessionModeBindingConfiguration"/&gt; 

                        &lt;service name="WCF.ServiceLib.InstanceMode.SingleMode" behaviorConfiguration="InstanceModeBehavior"&gt; 

                                &lt;endpoint address="" binding="basicHttpBinding" contract="WCF.ServiceLib.InstanceMode.ISingleMode" /&gt; 

                &lt;/services&gt; 

                &lt;bindings&gt; 

                        &lt;wsHttpBinding&gt; 

                                &lt;!--wsHttpBinding 可提供 安全會話 和 可靠會話--&gt; 

                                &lt;binding name="PerSessionModeBindingConfiguration"&gt; 

                                        &lt;!--訓示是否在通道終結點之間建立 WS-RM (WS-ReliableMessaging) 可靠會話。預設值為 false。--&gt; 

                                        &lt;reliableSession enabled="true"/&gt; 

                                        &lt;security&gt; 

                                                &lt;!--此屬性控制安全上下文令牌是否通過用戶端與服務之間的 WS-SecureConversation 交換建立。将它設定為 true 要求遠端方支援 WS-SecureConversation。--&gt; 

                                                &lt;message establishSecurityContext="true"/&gt; 

                                        &lt;/security&gt; 

                                &lt;/binding&gt; 

                        &lt;/wsHttpBinding&gt; 

                &lt;/bindings&gt; 

        &lt;/system.serviceModel&gt; 

&lt;/configuration&gt;

3、用戶端

Hello.aspx

&lt;%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Hello.aspx.cs" 

        Inherits="InstanceMode_Hello" Title="執行個體模型(InstanceContextMode)" %&gt; 

&lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"&gt; 

&lt;/asp:Content&gt; 

&lt;asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"&gt; 

        &lt;asp:Button ID="btnPerCallMode" runat="server" Text="PerCallMode"    

                 /&gt; 

        &lt;asp:Button ID="btnPerSessionMode" runat="server" Text="PerSessionMode"    

        &lt;asp:Button ID="btnSingleMode" runat="server" Text="SingleMode"    

&lt;/asp:Content&gt;

Hello.aspx.cs

using System.Collections; 

using System.Configuration; 

using System.Data; 

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(); 

                        string.Format("alert('計數器:{0}')", (Session["proxy"] as InstanceModeSvc.PerSessionMode.PerSessionModeClient).Counter()), 

        protected void btnSingleMode_Click(object sender, EventArgs e) 

                var proxy = new InstanceModeSvc.SingleMode.SingleModeClient(); 

                &lt;client&gt; 

                        &lt;!--address - 服務位址--&gt; 

                        &lt;!--binding - 通信方式--&gt; 

                        &lt;!--contract - 服務契約--&gt; 

                        &lt;endpoint address="http://localhost:3502/ServiceHost/InstanceMode/PerCallMode.svc" binding="basicHttpBinding" contract="InstanceModeSvc.PerCallMode.IPerCallMode" /&gt; 

                        &lt;!--bindingConfiguration - 指定相關的綁定配置--&gt; 

                        &lt;endpoint address="http://localhost:3502/ServiceHost/InstanceMode/PerSessionMode.svc" binding="wsHttpBinding" contract="InstanceModeSvc.PerSessionMode.IPerSessionMode" bindingConfiguration="PerSessionModeBindingConfiguration" /&gt; 

                        &lt;endpoint address="http://localhost:3502/ServiceHost/InstanceMode/SingleMode.svc" binding="basicHttpBinding" contract="InstanceModeSvc.SingleMode.ISingleMode" /&gt; 

                &lt;/client&gt; 

運作結果:

單擊"btnPerCallMode"按鈕,每次單擊,計數器都傳回1

單擊"btnPerSessionMode"按鈕,每次單擊并且會話相同,計數器會累加

單擊"btnSingleMode"按鈕,每次單擊,計數器都累加

OK

<a href="http://down.51cto.com/data/100781" target="_blank">[源碼下載下傳]</a>

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344149,如需轉載請自行聯系原作者

繼續閱讀