WCF服务实例激活类型编程与开发(转)
2011-08-09 16:50
381 查看
【引言】:
在WCF分布式开发必备知识(2):.Net Remoting这 篇文章里我已经介绍过了Net Remoting相关的概念,其中也包括Net Remoting的激活方式:SingleTon模式、SingleCall模式、客户端激活方式。其实WCF服务的激活方式也与此相似。服务激活方式也 是WCF借鉴Net Remoting的一个明显的例子。Net Remoting相关的概念大家可以查阅WCF分布式开发必备知识(2):.Net Remoting这篇文章。 下面我们就来详细的介绍WCF服务激活类型相关的知识点。首先来介绍的是单调服务。
WCF支持三种实例激活的类型:
1>.单调服务(Per-Call Service):每次的客户端请求分配一个新的服务实例。类似于Net Remoting的SingleCall模式;
2>.会话服务(Sessionful Service):则为每次客户端连接分配一个服务实例。类似于Net Remoting的客户端激活模式;
3>.单例服务(Singleton Service):所有的客户端会为所有的连接和激活对象共享一个相同的服务实例。类似于Net Remoting的SingleTon模式。
这里的服务激活模式是由我们定义的服务的上下文模式InstanceContextMode
属性来配置的,其代码如下:
public enum InstanceContextMode
{
PerSession,
PerCall,
Single
} 【1】单调服务(Call Service):
【1.1】基本概念
单调服务(Per-Call Service):每次的客户端请求分配一个新的服务实例。服务实例的生存周期紧紧限制于一次调用的开始与结束之间。客户端的每次请求都会产生新的服务实 例来响应这个调用。类似于Net Remoting的SingleCall模式。 执行步骤如下:
1. 客户端调用代理,代理将调用转发给服务。
2. WCF创建一个服务实例,然后调用服务实例的方法。
3. 当方法调用返回时,如果对象实现了IDisposable接口,WCF将调用IDisposable.Dispose()方法。
4. 客户端调用代理,代理将调用转发给服务。
5. WCF创建一个对象,然后调用对象的方法。
单调服务的实例化模型图:
} 【3.3】注意:
(1)单例服务同一时间内只能相应一个客户端请求。因此在系统的吞吐量、相应效率、系统服务性能上都存在严重的瓶颈。
【4】示例代码分析:
下面我们来介绍本次的示例代码,这里我们分别定义了三种激活类型的服务类:单调服务(Per-Call Service),会话服务(Sessionful Service),单例服务(Singleton Service),托管宿主分别进行托管,这里为了测试,我们使用的绑定协议也是TCP方式,其他的协议这里没做具体的实现,有兴趣的朋友可以自己扩展修 改代码,进行测试。
【4.1】服务端:
,定义了一个服务契约,一个操作SayHello(),具体的服务类型定义和激活类型配置如下:
//此例定义了一个服务契约,三种服务分别为单调服务、会话服务、单例服务或单件服务
namespace WCFService
{
//1.服务契约
[ServiceContract(SessionMode=SessionMode.Allowed, Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFService
{
//操作契约
[OperationContract]
void SayHello();
}
//2.服务类.单调服务
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class WCFServicePerCall : IWCFService,IDisposable
{
//服务实例计数
private int mCcount =0;
//构造函数
public WCFServicePerCall()
{
Console.WriteLine("WCFServicePerCall Instance is Created ");
}
//实现接口定义的方法
public void SayHello()
{
mCcount++;
Console.WriteLine("WCFServicePerCall Instance Count is: {0} ",mCcount);
}
//实现接口定义的方法Dispose
public void Dispose()
{
Console.WriteLine("WCFServicePerCall Instance is disposed ");
}
}
//3.服务类.会话服务
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class WCFServicePerSession : IWCFService
{
//服务实例计数
private int mCcount = 0;
//构造函数
public WCFServicePerSession()
{
Console.WriteLine("WCFServicePerSession Instance is Created ");
}
//实现接口定义的方法
public void SayHello()
{
mCcount++;
Console.WriteLine("WCFServicePerSession Instance Count is: {0} ", mCcount);
}
//实现接口定义的方法Dispose
public void Dispose()
{
Console.WriteLine("WCFServicePerSession Instance is disposed ");
}
}
//4.服务类.单例服务
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class WCFServiceSingleTon : IWCFService
{
//服务实例计数
private int mCcount = 0;
//构造函数
public WCFServiceSingleTon()
{
Console.WriteLine("WCFServiceSingleTon Instance is Created ");
}
//实现接口定义的方法
public void SayHello()
{
mCcount++;
Console.WriteLine("WCFServiceSingleTon Instance Count is: {0} ", mCcount);
}
//实现接口定义的方法Dispose
public void Dispose()
{
Console.WriteLine("WCFServiceSingleTon Instance is disposed ");
}
}
}
【4.2】宿主:
针对三种激活类型的服务分别定义了三个宿主实例:hostWCFServicePerCall、hostWCFServicePerSession、hostWCFServiceSingleTon。测试完毕,关闭宿主。代码具体如下:
//采用自托管方式,也可以是IIS、WAS,Windows服务等用户自定义程序托管服务
public class WCFHost
{
static void Main(string[] args)
{
//1.单调服务WCFServicePerCall
ServiceHost hostWCFServicePerCall = new ServiceHost(typeof(WCFService.WCFServicePerCall));
//判断是否以及打开连接,如果尚未打开,就打开侦听端口
if (hostWCFServicePerCall.State != CommunicationState.Opening)
hostWCFServicePerCall.Open();
//显示运行状态
Console.WriteLine("WCFServicePerCall Host is runing! and state is {0}", hostWCFServicePerCall.State);
//2.会话服务WCFServicePerSession
ServiceHost hostWCFServicePerSession = new ServiceHost(typeof(WCFService.WCFServicePerSession));
//判断是否以及打开连接,如果尚未打开,就打开侦听端口
if (hostWCFServicePerSession.State != CommunicationState.Opening)
hostWCFServicePerSession.Open();
//显示运行状态
Console.WriteLine("WCFServicePerSession Host is runing! and state is {0}", hostWCFServicePerSession.State);
//3.单例服务WCFServiceSingleTon
ServiceHost hostWCFServiceSingleTon = new ServiceHost(typeof(WCFService.WCFServiceSingleTon));
//判断是否以及打开连接,如果尚未打开,就打开侦听端口
if (hostWCFServiceSingleTon.State != CommunicationState.Opening)
hostWCFServiceSingleTon.Open();
//显示运行状态
Console.WriteLine("WCFServiceSingleTon Host is runing! and state is {0}", hostWCFServiceSingleTon.State);
//等待输入即停止服务
Console.Read();
//4 Close Host
hostWCFServicePerCall.Close();
hostWCFServicePerSession.Close();
hostWCFServiceSingleTon.Close();
} 绑定协议这里使用的是TCP,三个服务分别配置了服务的终结点,包括契约、地址、绑定。元数据交换节点也进行了配置。具体配置文件如下:
");
Console.Read(); 【4.4】运行结果:
启动托管宿主,运行客户端进行测试,监控服务输出信息如下:
【5】总结:
(1)单调服务每次都重新创建服务的实例,操作完成以后,释放服务对象,每次想用用户操作请求的服务实例不同。
(2)会话服务针对每次会话创建一个特定的服务实例对象,在一次会话中的所有请求由一个服务对象相应。我们的服务调用计数也在会话期间随客户端调用的次数增加,上图可见。
(3)单例服务在宿主创建时就进行了实例化。他和会话和调用次数没有关系,所有的客户单服务调用操作均有同一个服务实例来响应。客户单调用的次数越多,服务端实际调用次数就会随之增加。上图可见。
(4)另外我们也可以编程或者配置系统的最大并发调用数、最大并发会话数、最大并发实例数,来控制和管理服务实例的负荷和流量。
http://blog.csdn.net/book_frank_xl/article/details/4735912
在WCF分布式开发必备知识(2):.Net Remoting这 篇文章里我已经介绍过了Net Remoting相关的概念,其中也包括Net Remoting的激活方式:SingleTon模式、SingleCall模式、客户端激活方式。其实WCF服务的激活方式也与此相似。服务激活方式也 是WCF借鉴Net Remoting的一个明显的例子。Net Remoting相关的概念大家可以查阅WCF分布式开发必备知识(2):.Net Remoting这篇文章。 下面我们就来详细的介绍WCF服务激活类型相关的知识点。首先来介绍的是单调服务。
WCF支持三种实例激活的类型:
1>.单调服务(Per-Call Service):每次的客户端请求分配一个新的服务实例。类似于Net Remoting的SingleCall模式;
2>.会话服务(Sessionful Service):则为每次客户端连接分配一个服务实例。类似于Net Remoting的客户端激活模式;
3>.单例服务(Singleton Service):所有的客户端会为所有的连接和激活对象共享一个相同的服务实例。类似于Net Remoting的SingleTon模式。
这里的服务激活模式是由我们定义的服务的上下文模式InstanceContextMode
属性来配置的,其代码如下:
public enum InstanceContextMode
{
PerSession,
PerCall,
Single
} 【1】单调服务(Call Service):
【1.1】基本概念
单调服务(Per-Call Service):每次的客户端请求分配一个新的服务实例。服务实例的生存周期紧紧限制于一次调用的开始与结束之间。客户端的每次请求都会产生新的服务实 例来响应这个调用。类似于Net Remoting的SingleCall模式。 执行步骤如下:
1. 客户端调用代理,代理将调用转发给服务。
2. WCF创建一个服务实例,然后调用服务实例的方法。
3. 当方法调用返回时,如果对象实现了IDisposable接口,WCF将调用IDisposable.Dispose()方法。
4. 客户端调用代理,代理将调用转发给服务。
5. WCF创建一个对象,然后调用对象的方法。
单调服务的实例化模型图:
} 【3.3】注意:
(1)单例服务同一时间内只能相应一个客户端请求。因此在系统的吞吐量、相应效率、系统服务性能上都存在严重的瓶颈。
【4】示例代码分析:
下面我们来介绍本次的示例代码,这里我们分别定义了三种激活类型的服务类:单调服务(Per-Call Service),会话服务(Sessionful Service),单例服务(Singleton Service),托管宿主分别进行托管,这里为了测试,我们使用的绑定协议也是TCP方式,其他的协议这里没做具体的实现,有兴趣的朋友可以自己扩展修 改代码,进行测试。
【4.1】服务端:
,定义了一个服务契约,一个操作SayHello(),具体的服务类型定义和激活类型配置如下:
//此例定义了一个服务契约,三种服务分别为单调服务、会话服务、单例服务或单件服务
namespace WCFService
{
//1.服务契约
[ServiceContract(SessionMode=SessionMode.Allowed, Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFService
{
//操作契约
[OperationContract]
void SayHello();
}
//2.服务类.单调服务
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class WCFServicePerCall : IWCFService,IDisposable
{
//服务实例计数
private int mCcount =0;
//构造函数
public WCFServicePerCall()
{
Console.WriteLine("WCFServicePerCall Instance is Created ");
}
//实现接口定义的方法
public void SayHello()
{
mCcount++;
Console.WriteLine("WCFServicePerCall Instance Count is: {0} ",mCcount);
}
//实现接口定义的方法Dispose
public void Dispose()
{
Console.WriteLine("WCFServicePerCall Instance is disposed ");
}
}
//3.服务类.会话服务
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class WCFServicePerSession : IWCFService
{
//服务实例计数
private int mCcount = 0;
//构造函数
public WCFServicePerSession()
{
Console.WriteLine("WCFServicePerSession Instance is Created ");
}
//实现接口定义的方法
public void SayHello()
{
mCcount++;
Console.WriteLine("WCFServicePerSession Instance Count is: {0} ", mCcount);
}
//实现接口定义的方法Dispose
public void Dispose()
{
Console.WriteLine("WCFServicePerSession Instance is disposed ");
}
}
//4.服务类.单例服务
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class WCFServiceSingleTon : IWCFService
{
//服务实例计数
private int mCcount = 0;
//构造函数
public WCFServiceSingleTon()
{
Console.WriteLine("WCFServiceSingleTon Instance is Created ");
}
//实现接口定义的方法
public void SayHello()
{
mCcount++;
Console.WriteLine("WCFServiceSingleTon Instance Count is: {0} ", mCcount);
}
//实现接口定义的方法Dispose
public void Dispose()
{
Console.WriteLine("WCFServiceSingleTon Instance is disposed ");
}
}
}
【4.2】宿主:
针对三种激活类型的服务分别定义了三个宿主实例:hostWCFServicePerCall、hostWCFServicePerSession、hostWCFServiceSingleTon。测试完毕,关闭宿主。代码具体如下:
//采用自托管方式,也可以是IIS、WAS,Windows服务等用户自定义程序托管服务
public class WCFHost
{
static void Main(string[] args)
{
//1.单调服务WCFServicePerCall
ServiceHost hostWCFServicePerCall = new ServiceHost(typeof(WCFService.WCFServicePerCall));
//判断是否以及打开连接,如果尚未打开,就打开侦听端口
if (hostWCFServicePerCall.State != CommunicationState.Opening)
hostWCFServicePerCall.Open();
//显示运行状态
Console.WriteLine("WCFServicePerCall Host is runing! and state is {0}", hostWCFServicePerCall.State);
//2.会话服务WCFServicePerSession
ServiceHost hostWCFServicePerSession = new ServiceHost(typeof(WCFService.WCFServicePerSession));
//判断是否以及打开连接,如果尚未打开,就打开侦听端口
if (hostWCFServicePerSession.State != CommunicationState.Opening)
hostWCFServicePerSession.Open();
//显示运行状态
Console.WriteLine("WCFServicePerSession Host is runing! and state is {0}", hostWCFServicePerSession.State);
//3.单例服务WCFServiceSingleTon
ServiceHost hostWCFServiceSingleTon = new ServiceHost(typeof(WCFService.WCFServiceSingleTon));
//判断是否以及打开连接,如果尚未打开,就打开侦听端口
if (hostWCFServiceSingleTon.State != CommunicationState.Opening)
hostWCFServiceSingleTon.Open();
//显示运行状态
Console.WriteLine("WCFServiceSingleTon Host is runing! and state is {0}", hostWCFServiceSingleTon.State);
//等待输入即停止服务
Console.Read();
//4 Close Host
hostWCFServicePerCall.Close();
hostWCFServicePerSession.Close();
hostWCFServiceSingleTon.Close();
} 绑定协议这里使用的是TCP,三个服务分别配置了服务的终结点,包括契约、地址、绑定。元数据交换节点也进行了配置。具体配置文件如下:
");
Console.Read(); 【4.4】运行结果:
启动托管宿主,运行客户端进行测试,监控服务输出信息如下:
【5】总结:
(1)单调服务每次都重新创建服务的实例,操作完成以后,释放服务对象,每次想用用户操作请求的服务实例不同。
(2)会话服务针对每次会话创建一个特定的服务实例对象,在一次会话中的所有请求由一个服务对象相应。我们的服务调用计数也在会话期间随客户端调用的次数增加,上图可见。
(3)单例服务在宿主创建时就进行了实例化。他和会话和调用次数没有关系,所有的客户单服务调用操作均有同一个服务实例来响应。客户单调用的次数越多,服务端实际调用次数就会随之增加。上图可见。
(4)另外我们也可以编程或者配置系统的最大并发调用数、最大并发会话数、最大并发实例数,来控制和管理服务实例的负荷和流量。
http://blog.csdn.net/book_frank_xl/article/details/4735912
相关文章推荐
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- WCF服务实例激活类型编程与开发
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- 使用WCF实现SOA面向服务编程——简单的WCF开发实例
- 一起谈.NET技术,使用WCF实现SOA面向服务编程——简单的WCF开发实例
- 使用W“.NET技术”CF实现SOA面向服务编程——简单的WCF开发实例
- 热门话题:使用WCF实现SOA面向服务编程(二)——实现简单的WCF开发实例
- 使用WC“.NET研究”F实现SOA面向服务编程——简单的WCF开发实例
- WCF与AJAX编程开发实践(5):支持XML的Ajax WCF服务
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗
- 热门话题:使用WCF实现SOA面向服务编程(三)—— 使用AJAX+WCF实现页面开发
- WCF分布式开发步步为赢(4):WCF服务可靠性传输配置与编程开发
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗
- WCF热门问题编程示例(2)多个实例调用一个WCF服务操作,需要等待服务响应吗
- 一起谈.NET技术,使用WCF实现SOA面向服务编程——使用AJAX+WCF服务页面开发
- WCF分布式开发步步为赢(3)WCF服务元数据交换、配置及编程开发
- WCF分布式开发步步为赢(4):WCF服务可靠性传输配置与编程开发