精华内容
下载资源
问答
  • WCF中有哪几种对象实例模式? 几种实例模式下对象的生命周期? 各种实例模式的应用场合? 使用不同的实例模式,需要注意的有哪些? 代码不骗人,用一个小范例来看看不同实例模式的区别? 本文适合的读者 ...

    转: https://www.cnblogs.com/millen/archive/2009/06/20/1507479.html

     

    本文出发点:

    通过阅读本文,您可以了解以下知识:

    1. WCF中有哪几种对象实例模式?
    2. 几种实例模式下对象的生命周期?
    3. 各种实例模式的应用场合?
    4. 使用不同的实例模式,需要注意的有哪些?
    5. 代码不骗人,用一个小范例来看看不同实例模式的区别?

    本文适合的读者

    本文适合有一定WCF基础知识的初学者

    WCF中有哪几种对象实例创建模式?

    WCF中有三种实例模式,这在.Net Framework中已经用InstanceContextMode枚举具体的列了出来,它们分别为:PerSession,PerCall,Single

    几种实例模式下对象的生命周期?

    PerCall

    PerCall模式工作流程如下

    1. 客户端创建代理对象(Proxy)
    2. 客户端调用代理对象的一个契约操作,代理对象将其传递给服务宿主程序。
    3. 宿主应用程序创建一新的服务契约对象,并且执行请求操作
    4. 在执行完请求操作后,如果要求有应答,那么服务契约会给代理对象一个应答,然后销毁自己(如果实现了IDisposable,则调用Dispose())。

    PerSession

    PerSession模式工作的流程如下:

    1. 客户端创建代理对象(Proxy)
    2. 客户端第一次调用代理对象的一个契约操作,代理对象将其调用请求传递给服务宿主
    3. 宿主程序创建新的服务对象,并执行请求操作,如果有必要,返回客户端应答
    4. 客户端再次发出调用操作的请求,宿主会先判断是否已有建立好的会话,如果存在,则不需要再创建新的服务对象,直接使用老对象即可。
    5. 在时间达到指定要求或者因一些特殊原因,会话会过期,此时服务对象销毁。

    Single

    Single模式工作流程如下:

    1. 服务端启动,同时创建服务对象
    2. 客户端通过代理调用契约操作
    3. 第一步中创建的服务对象接受请求 ,并执行操作,进行必要的应答
    4. 第一步创建的服务对象将一直保留
    5. 服务关闭,第一步创建的对象销毁

    各种实例模式的应用场合?

    PerCall

    在传统模式C/S模式的应用程序中,通常情况下存在这样的问题:客户端请求服务端之后,服务端并不是马上对处理客户端请求时需要的资源进行释放,服务端往往自作多情的认为客户端一定是个老主顾,会时不时来消费一番。可他却没想到,有的时候,客户端是个昧良心的家伙,就算服务端再怎么献殷勤,客户端也不买账。而对于一些非常珍贵的资源,比如数据库连接,文件,图像,通讯端口等。服务这种做法往往会使这些资源长期被不来消费的客户端空闲占用,当有新的请求真正要用使用他们的时候,却因为资源耗尽而无法处理。这样对服务端就得不偿失了,而PerCall就是对上面提到问题的一种解决方案。它采用类似快餐式的经营方式,当一个请求操作来到的时候,再创建服务对象,申请必要资源,而当操作完毕之后,立即销毁对象并释放资源,留给下一个请求。这就可能大大提高服务端的吞吐能力。而且WCF中默认的实例创建模式就是这种。

    PerSession

    正如上面对PerCall的描述所说,PerSession与传统的C/S模式应用程序非常相似,它能在服务端和客户端维护状态,当一个服务对象创建之后不会马上销毁,而是等待客户端再次来消费它,那这种的坏处也说过了,可能会浪费宝贵的服务资源,可它也是有好处的。比如它能够保持连接和维护状态,这在要求有回调的情况下特别重要,因为如果服务端连哪个家伙点的菜都忘记了怎么为客人上菜呢?还有一种情况,服务端操作不需要比较多的资源或者占用的资源也不宝贵的情况下,而却与客户端在不同的网络中,它们之间进行一次连接可费了老劲,这时也适用于此种实例模式。

    Single

    大家经常去理发吧?去那大的理发店,里面的理发师这家伙这个多,你随便找个就能帮你料理了,可兄弟我比较穷酸,每次都去小区理发店,里面连洗头,在理发就1位师傅,小区人可不少,僧多饭少,你说咱进去得排队吧。人家理发的时候,咱就得边上看着,得人家都整完了,嘿,咱就洗头,理发,吹风来个一条龙。Single模式就像上面提到的小区理发店,人家从早晨一开业,理发师就给你准备好了,您也甭挑蹦捡。伺候完你,他再伺候别人,为何要这么做?其实道理也很简单,如果理发师不喝水,不吃饭,不用管食宿,不用工钱,不会唧唧歪歪,那理发店老板娘肯定请1万个过来。可现实不是那样子的,是这些理发师都要吃喝拉撒睡,还要拿俸禄,就一个几十平米的小理发店,估计给老板娘卖了也不够他们的呢。

    使用不同的实例模式,需要注意的有哪些?

    1. 对于PerCall模式,一定要记住,如果服务对象中的数据没有固化,并且不是静态变量,那它每次操作都会被重新初始化。
    2. 对于PerSession模式,第一要清楚有些Binding是不能用于此种模式的,具体什么可用,什么不能用,可以查阅http://www.cnblogs.com/jillzhang/archive/2008/02/03/1063406.html 。另外,PerSession模式并不是代表状态会自动维护,那些被设置了IsTerminating=True的操作完成的时候,也会释放资源和销毁对象。即使不是Ture,那如果客户端长时间不与服务端联系,达到服务端最大忍耐限度,服务端也会变心。
    3. 对于Single模式,既然例外就它老哥一个,就简单得多了,它能保持服务对象中的非静态全局变量。但是特别要注意的是,如果在这种模式下的话,要特别注意线程安全的问题,让10个人同时让一个理发师傅来服务。

    代码不骗人,用一个小范例来看看不同实例模式的区别?

    写了一个简单的范例,来验证和说明上述的观点,下面就先看一下最后的运行效果:

    服务端运行效果解图:

    从上面的解图可以看出,在服务启动的时候,也就是宿主ServiceHost.Open()的时候,便已经创建了Single模式的服务对象实例

    客户端运行效果截图:

    再回过头来看服务端效果:

    展开全文
  • 转自 ... 参考另一个:http://www.codeproject.com/Articles/188749/WCF-Sessions-Brief-Introduction 1、WCF 几种服务对象实例创建模式 wcf中有三种服务对象实例创建模式:PerCall、Pe...

    转自 http://www.cnblogs.com/smallstone/archive/2011/12/07/2277194.html

    参考另一个:http://www.codeproject.com/Articles/188749/WCF-Sessions-Brief-Introduction

    1、WCF 几种服务对象实例创建模式

    wcf中有三种服务对象实例创建模式:PerCall、PerSession、Single.(具体在哪里设置,最后例子中有很好的阐述)

    2、几种模式下服务对象实例的生命周期(这里暂不考虑Mep)

     PerCall模式

      PerCall模式工作流程如下

    •    客户端创建代理对象(Proxy)
    •    客户端调用代理对象的一个契约操作,代理对象将其传递给服务宿主程序
    •    宿主应用程序创建一新的服务契约对象,并且执行请求操作
    •    在执行完请求操作后,如果要求有应答,那么服务契约会给代理对象一个应答,然后销毁自己

      示例代码展示

      服务契约代码如下:

     

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;

    namespace Contract
    {
    [ServiceContract(Name="CalculatorService",Namespace="http://www/gxs.com")]
    public interface ICalculator:IDisposable
    {
    [OperationContract(Name = "CalculatorAdd")]
    double Add(double x, double y);
    [OperationContract(Name = "CalculatorSubtract")]
    double Subtract(double x, double y);
    }
    }
    复制代码

    服务代码如下:

     

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Contract;
    using System.ServiceModel;

    namespace Service
    {
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class CalculatorPerCall:ICalculator
    {
    public CalculatorPerCall()
    {
    Console.WriteLine("Create a new instance!!!");
    }
    public double Add(double x, double y)
    {
    Console.WriteLine("Call [Add] Method");
    return x + y;
    }
    public double Subtract(double x, double y)
    {
    Console.WriteLine("Call [Subtract] Method");
    return x - y;
    }
    public void Dispose()
    {
    Console.WriteLine("The instance has been disposed!!!");
    }
    }
    }
    复制代码

     

    服务端宿主代码如下:

     

     

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using Contract;
    using Service;
    using System.ServiceModel.Description;

    namespace Hosting
    {
    class Program
    {
    static void Main(string[] args)
    {
    using (ServiceHost host = new ServiceHost(typeof(CalculatorPerCall)))
    {
    host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://127.0.0.1:8089/CalculatorService");
    //ServiceMetadataBehavior:控制服务元数据和相关信息的发布
    if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
    {
    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
    behavior.HttpGetEnabled = true;
    behavior.HttpGetUrl = new Uri("http://127.0.0.1:8089/CalculatorService/metadata");
    host.Description.Behaviors.Add(behavior);
    }
    host.Opened += new EventHandler(host_Opened);
    host.Open();
    Console.Read();
    }
    }

    static void host_Opened(object sender, EventArgs e)
    {
    Console.WriteLine("计算机服务已经被打开了......");
    }
    }
    }
    复制代码



    客户端代码如下:

     

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace WcfLifeCycle.Client
    {
    /// <summary>
    /// wcf实例模型
    /// </summary>
    public class ClientCalculator
    {
    public static void Main(string[] args)
    {
    CalculatorServiceClient proxy1 = new CalculatorServiceClient();
    Console.WriteLine("proxy1 Call [Add] method");
    proxy1.CalculatorAdd(12d, 13d);
    Console.WriteLine("proxy1 Call [Add] method");
    proxy1.CalculatorAdd(12d, 13d);
    Console.WriteLine("proxy1 Call [Add] method");
    proxy1.CalculatorAdd(12d, 13d);
    Console.WriteLine("******************************************");
    CalculatorServiceClient proxy2= new CalculatorServiceClient();
    Console.WriteLine("proxy2 Call [Add] method");
    proxy2.CalculatorAdd(12d, 13d);
    Console.WriteLine("proxy2 Call [Add] method");
    proxy2.CalculatorAdd(12d, 13d);
    Console.WriteLine("proxy2 Call [Add] method");
    proxy2.CalculatorAdd(12d, 13d);
    Console.Read();
    }
    }
    }
    复制代码

     结果示例图

     服务端:

    客户端

    小结:Percall模式,客户端每次发出请求后,服务端都会生成一个实例响应,响应完毕后自行销毁。

     PerSession模式

     

    PerSession模式工作的流程如下:

    • 客户端创建代理对象(Proxy) 
    • 客户端第一次调用代理对象的一个契约操作,代理对象将其调用请求传递给服务宿主
    • 宿主程序创建新的服务对象,并执行请求操作,如果有必要,返回客户端应答
    • 客户端再次发出调用操作的请求(图中的proxy一与服务实例一对应,proxy二与服务实例二对应),宿主会先判断是否已有建立好的会话,如果存在,则不需要再创建新的服务对象,直接使用老对象即可,如果不存在则新建一个服务对象。
    • 在时间达到指定要求或者因一些特殊原因,会话会过期,此时服务对象销毁.或者客户端关闭,服务对象也会自动销毁。

    示例代码展示

      服务契约代码如下:

     

    View Code

    服务代码如下:

     

    View Code

     

     

    服务端宿主代码

     

    View Code

     


    客户端代码如下:

     

    View Code
    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace WcfLifeCycle.Client
    {
    /// <summary>
    /// wcf实例模型
    /// </summary>
    public class ClientCalculator
    {
    public static void Main(string[] args)
    {
    CalculatorServiceClient proxy1 = new CalculatorServiceClient();
    Console.WriteLine("proxy1 Call [Add] method");
    proxy1.CalculatorAdd(12d, 13d);
    Console.WriteLine("proxy1 Call [Add] method");
    proxy1.CalculatorAdd(12d, 13d);
    Console.WriteLine("proxy1 Call [Add] method");
    proxy1.CalculatorAdd(12d, 13d);
    Console.WriteLine("******************************************");
    CalculatorServiceClient proxy2= new CalculatorServiceClient();
    Console.WriteLine("proxy2 Call [Add] method");
    proxy2.CalculatorAdd(12d, 13d);
    Console.WriteLine("proxy2 Call [Add] method");
    proxy2.CalculatorAdd(12d, 13d);
    Console.WriteLine("proxy2 Call [Add] method");
    proxy2.CalculatorAdd(12d, 13d);
    Console.Read();
    }
    }
    }
    复制代码


    结果实例图

    服务端

     

     

    客户端

     

    小结:PerSession模式,proxy与服务实例对应。不同的proxy有不同的服务实例。

    Single模式

     

    Single模式的工作流程如下:

    • 服务端启动,同时创建服务对象
    • 客户端通过代理调用契约操作
    • 第一步中创建的服务对象接受请求 ,并执行操作,进行必要的应答
    • 第一步创建的服务对象将一直保留
    • 服务关闭,第一步创建的对象销毁

    示例代码展示:

    服务契约代码

     

    View Code

     
    服务代码

    View Code

    服务端宿主代码

    View Code

     

    客户端一代码

    View Code

    客户端一配置文件app.config

    View Code

    客户端二代码

    View Code

    客户端二配置文件app.config

    View Code

    结果实例图

    服务端

    客户端一

    客户端二

    小结:服务端自始至终只有一个实例与客户端进行消息的交换。

    总 结:上文是对服务对象实例生命周期的介绍.Percall:新的请求产生新的服务对象与之交换信息,服务对象自行销毁;PerSession:相同的客户 端由同一个服务对象与之交换信息(这里的客户端指proxy);Single:服务端只有一个服务实例,服务打开时服务实例就会被创建。

    转载于:https://www.cnblogs.com/webglcn/archive/2012/05/02/2479873.html

    展开全文
  • WCF实例模式类型与区别 实例化模式 instanceMode percall 单调模式 [ServiceBehavior(InstanceContextMode=InstanceContext...

    WCF实例模式类型与区别                                      

     

    实例化模式 instanceMode                                           

    • percall        单调模式 
    • [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
    • persession  会话模式
    • [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
    • singleTon   单例模式
    • [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]

       

     

    •  QQ截图20141130201340                              QQ截图20141130205917

                                                    示意图

     

    并发控制

    • WCF可以控制并发
    • 服务行为设置
    • <servieceThrotting

                maxConcurrentCalls=”1000”   //

                maxConcurrentInstances=”1000”

                maxConcurrentSessions=”1000”/>

    • 最大请求消息数
    • 最大服务实例数
    • 最大会话实例数

        并发控制默认值和WCF版本

        注:建议使用自定义配置不要使用系统默认配置以便程序能够及时定位错误

    项目

    3.0

    3.5

    4.0

    4.5

    MaxCall

    16

    16

    16

    16X处理器

    MaxInstance

    Int32.MaxValue

    26

    26

    maxCall+MaxSession

    MaxSession

    10

    10

    10

    100X处理器

      

     

     

     

     

    转载于:https://www.cnblogs.com/running-mydream/p/4133719.html

    展开全文
  • WCF实例模式与高并发控制 1.实例化模式InstanceModel 1.1 PerCall:单调模式 每次调用都会产生一个实例 例[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 1.2 PerSession会话模式 ...

    WCF实例化模式与高并发控制

    1.实例化模式InstanceModel

    1.1 PerCall:单调模式

        每次调用都会产生一个实例

        例[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]

     

    1.2 PerSession会话模式   

        每次调用都有同一个服务进行处理

        [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]

     

    1.3 SingleTon 单例模式    

        多个请求,只有一个实例

        [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]

     

     

    2.并发控制

    在服务行为里设置

    <serviceThrottling

       maxConcurrentCalls="1000"         //最大并发请求消息数量

       maxConcurrentInstances="1000"     //最大并发服务实例的数量

       maxConcurrentSessions="1000" />   //最大并发会话连接数

     

     

    <behaviors>
      <serviceBehaviors>
          <behavior name="WCFService.WCFServiceBehavior">
             <serviceMetadata httpGetEnabled="false"/>
             <serviceDebug includeEXceptionDetilInfaults="false"/>
             <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessins="100" maxConcurrentInstances="1000"/>
          </behavior>
      </serviceBehaviors>
    </behaviors>
    View Code

     

    转载于:https://www.cnblogs.com/chcong/p/4243172.html

    展开全文
  • wcf实例化-单调服务模式,言简意赅,很容易理解。就是现在积分没发控制,不然1分即可。很简单的代码
  • 实例上下文模式 InstanceContextMode 控制在响应客户端调用时,如何分配服务实例。InstanceContextMode 可以设置为以下值: •Single – 为所有客户端调用分配一个服务实例。 •PerCall – 为每个客户端调用分配...
  • WCF学习--WCF服务实例模式

    千次阅读 2012-09-21 16:16:16
    学习WCF的目的在于使用WCF建立服务,使Sivlerlight程序能够查询和修改Oracle数据的内容,数据库的...事务对象保持不变,才能保证Commit或Rollback操作的成功,为此,查询了相关资料,好像可以通过WCF的服务实例(Servi
  • 1、WCF实例化,是指对用户定义的服务对象以及与其相关的实例上下文对象的生存期的控制,也就是说每一个服务类其实就是一个服务实例,客户端在调用服务端中的服务方法时,需要实例化一个服务端代理类对象,实例化就是对这...
  • WCF实例模式(InstanceContextMode)与会话模式(SessionMode) InstanceContextMode为服务端实现服务契约类的实例模式,有三种类型,分别为:PerCall-每次服务操作调用创建一次, 调用完后进行销毁;Per...
  • 很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间。 Wcf框架提供了三种创建wcf实例的方式。 WCF服务对象实例化基础 在普通的WCF请求和相应过程中,将产生下列活动: ...
  • wcf实例管理

    2010-11-07 00:36:00
    WCF支持三种实例激活的类型:单调服务(Per- Call Service)会为每次的客户端请求分配(销毁)一个新的服务实例。会话服务(Sessionful Service)则为每次客户端...实例模式的配置通过ServiceBehavior完成,以下是S...
  • WCF实例与并发

    2015-11-14 12:24:04
    WCF中的并发针对服务而言。而服务实例封装在InstanceContext,所以WCF中的并发最终体现在了InstanceContext中。WCF服务实例上下文模式InstanceContextMode又决定服务以何种方法为客户端提供服务。  
  • WCF实例生命周期

    2018-02-05 21:06:47
    WCF的工作原理 首先: WCF的全称是Windows Communication Foundation,Windows通信基础的意思,是Microsoft为构建面向服务的应用程序而提供的统一编程模型,它整合.NET平台下所有和分布式系统有关的技术。 其次:...
  • WCF实例模型

    2012-03-20 23:40:39
    1、实例模型的配置  ServiceBehaviorAttribute控制这个设置 2、Per Call服务  为每个调用创建新的服务对象,增加了整体的吞吐量,状态不会在多次调用中存在,  服务实例被释放,内存开销小,不会产生并发...
  • 每次调用服务是Windows通讯基础的默认实例激活模式。当一个WCF服务配置为每个调用服务,一个CLR对象是时间跨度客户调用或请求进行创建。 CLR代表公共语言运行库,并在WCF服务实例。 在每个调用服务,每一个...
  • WCF服务实例模式与并发、限流

    千次阅读 2013-07-16 10:26:23
    服务实例模式 真正实现逻辑是在Service instance中发生的,client调用最终产生Service Instance的过程叫Activation(激活)。在Remoting中我们有两种Activation方式:Server Activation(Singleton和...
  • WCF实例 - 简介

    2012-11-26 17:13:00
    我打算为Sharpy应用程序的服务端使用在WCF实例的文章中所讨论的模式。这个目标是为了演示Metro应用程序和我们目前所遇见过的应用程序类型的相似性。目前还没有可用的代码,但希望这个很快就会改变。我希望你能喜欢。...
  •   本文的主要结构为:1)WCF实例管理的概述2)WCF服务实例激活类型三种方式概述3)实现代码分析及运行结果4)源码下载5)下一篇计划6)参考说明 (1)WCF实例管理的概述(what) 1.1实例管理是WCF使用的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,018
精华内容 3,207
关键字:

wcf实例模式