您的位置:首页 > 其它

《WCF按部就班学习系列4_WCF实例管理概述》

2011-02-09 10:13 495 查看
本文的主要结构为:1)WCF实例管理的概述2)WCF服务实例激活类型三种方式概述3)实现代码分析及运行结果4)源码下载5)下一篇计划6)参考说明

(1)WCF实例管理的概述(what)

1.1实例管理是WCF使用的一系列技术的总称,通过它可以将客户端的请求绑定到服务实例上,并根据客户端请求的类型以确定服务实例的管理方式。

1.2WCF支持三种实例激活的类型:单调服务(Pcr-Call Service)会为每次的客户端请求分配(销毁)一个新的服务实例。

会话服务(Sessionful Service)则为每次客户端连接分配一个服务实例。

单例服务(Singleton Service),所有的客户端会为所有的连接和激活对象共享一个相同的服务实例。

(2)WCF服务实例激活类型三种方式概述

2.1单调服务(Call Service):

1.单调服务(Per-Call Service):每次的客户端请求分配一个新的服务实例。服务实例的生存周期紧紧限制于一次调用的开始与结束之间。客户端的每次请求都会产生新的服务实例来响应这个调用。

2.执行步骤如下:图4-1单调服务实例化模型图

3.[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]特性只能应用到类上。

4.如果使用了昂贵的资源,如数据库连接等非托管资源,继承IDisposable接口,实现接口定义的方法Dispose()方法显示释放资源。但是也有弊端,频繁地创建与销毁实例,仍然会对性能造成一定的影响。

5.对于WCF服务而言,单调服务可以算是最佳的实例激活模式。单调服务的一个最重要优势在于它能够节省资源,支持系统的可伸缩性。另外在事务编程与队列服务中优势更为明显,在事务编程中新建服务实例,减少实例状态的同步;而消息队列,单调服务能够建立服务实例与队列消息之间的简单映射。

2.2会话服务(Sessionful Service)

1.会话服务(Sessionful Service):则为每次客户端连接分配一个服务实例。为每个客户端创建一个专门的服务实例。只要会话没有结束,该实例就不会被销毁。 对于会话服务而言,是一个客户端代理对应一个服务实例。也就是说,会话服务中的服务是与代理相对应的,而不是对应于一个客户端。

2.服务配置[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]之后,需要在服务契约一级配置[ServiceContract(SessionMode=SessionMode.Allowed)],服务元数据将包含SessionMode值.

3.客户端的WCF反序列化后会包含此信息,来确定服务是否使用了会话模式,SessionMode为枚举类型:

public enum SessionMode

{

Allowed,

Required,

NotAllowed

}

4.会话服务存在可伸缩性的问题。由于每个客户端都需要维护一个会话,需要占用较多的资源来保存服务会话状态。如果存在多个独立的客户端,则创建专门的服务实例的代价太大。

5.应该避免将单调服务与会话契约混合定义在相同的会话服务类型中,会话应该保证是可靠的,一个实现了会话契约的服务,它包含的所有终结点所公开的契约都应该使用支持可靠传输会话的绑定。

6.InactivityTimeout可以配置一个新的空闲超时值,服务实例空闲时间超过这个范围时候就会终止会话。InactivityTimeout属性的默认值为10分钟。不能将该值设置为小于或等于0的值,否则会抛出ArgumentOutOfRangeException异常。

2.3单例服务(Singleton Service)

1.设计模式中最简单和容易理解的就是单例(单件)模式(SingleTon),单例服务(Singleton Service)也是一种单件模式的实践应用的例子。单例服务(Singleton Service)就是针对所有客户端而言,都只有一个服务实例。单例服务的生存期是不受GC管理,不会终止,只有在关闭宿主时,才会被释放。创建宿主时,单例服务的实例就会被创建(这个可以再托管宿主的监控状态信息中得到证实,宿主运行时候,单例服务的已经显示实例化完毕,而单调服务和会话服务实例尚未启动),并且只能被创建一次,一直运行下去,有且仅有一个服务实例来响应客户端服务调用的请求。

2.服务实例的单调激活模式可以通过[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]配置完成。

3.单例服务同一时间内只能相应一个客户端请求。因此在系统的吞吐量、相应效率、系统服务性能上都存在严重的瓶颈。

(3)实现代码分析及运行结果

3.1WCFService(服务类.单调服务)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;
//该例子定义一个服务器契约,三种服务分别为单调服务,会话服务,单例服务。
namespace WCFService
{
// 服务契约
[ServiceContract]
public interface IMyContract
{
[OperationContract]
void MyMethod();
}

#region  1.服务类.单调服务
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MyService : IMyContract,IDisposable
{
private int m_Counter = 0;
public MyService()
{
Console.WriteLine("m_Counter=" + m_Counter, "MyService.MyService()");
}
public void MyMethod()
{
m_Counter++;
Console.WriteLine("m_Counter=" + m_Counter, "MyService.MyMethod()");
}
public void Dispose()
{
Console.WriteLine("Dispose","MyService");
}
}
#endregion


3.2WCFHost(单调服务 WCFServicePerCall)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace WCFHost
{
public class Program
{
static void Main(string[] args)
{
#region 1.单调服务 WCFServicePerCall
ServiceHost host = new ServiceHost(typeof(WCFService.MyService), new Uri("http://localhost:1222/"));
if (host.State != CommunicationState.Opened)
{
host.Open();
}
Console.WriteLine("WCFServicePerCall is running ,the state is {0}", host.State);
Console.WriteLine("press any key.....");
Console.ReadKey();
host.Close();
#endregion


3.3WCFClient(单调服务代理实例化,每次调用操作,会创建不同的服务实例)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WCFClient
{
class Program
{
static void Main(string[] args)
{
#region 1.单调服务代理实例化,每次调用操作,会创建不同的服务实例
MyContractClient proxy1 = new MyContractClient();
// 调用2次服务
for (int i = 0; i < 2; i++)
{
proxy1.MyMethod();
}
#endregion


(4)源码下载
http://download.csdn.net/source/3014131
(5)下一篇计划

下一篇主要介绍WCF中操作的相关知识。

(6)参考说明

1.《Programming WCF Services》

2.http://www.cnblogs.com/frank_xl/archive/2009/04/29/1437493.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: