上面只是默认情况,因为wcf为我们提供了配置选项,我们只需显式指定 ServiceBehaviorAttribute的 InstanceContextMode的值即可实现有状态的服务,还可以实现全局的。 ServiceBehavior是一个类特性,所以我们不能在接口上应用。 InstanceContextMode是一个枚举类型,包含PerCall,PerSession,Single三个值。从字面上我们就可以看出他们的意思。注意服务的状态其实是与客户端代理类有相同的生命周期,也就是说我们可以通过调用客户端代理类的close方法来显示清除一个服务类的状态信息。另外,BasicHttpBinding的binding是没有状态的,所以我们不能用这个bind来让服务类保持状态。
PerCall
每次调用都会创建新的对象,虽然我们没有显式创新,但代理对象会帮我们做这些。如
服务端
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class EmployeeService : IEmployeeService
{
private int count = 0;
#region IEmployeeService Members
public void ShowInvokeNumber()
{
count++;
Console.WriteLine("count = {0}", count);
}
#endregion
}
EmployeeServiceProxy proxy = new EmployeeServiceProxy("netEmployeeService");
proxy.ShowInvokeNumber();
proxy.ShowInvokeNumber();
proxy.ShowInvokeNumber();
虽然我们只创建了一个代理对象,服务器端的对象会在每次调用完后进行释放,当再次调用时,会创建一个新的对象。
PerSession
简单的说它每个客户端共享一个对象,只在第一次调用时创建。
Single
是所以客户端共享一个对象。
通过我提供的演示demo,可以很清楚看到这其中的差别。注意服务器端的输出
percall输出的是
count = 1
count = 1
count = 1
persession输出的是
count = 1
count = 2
count = 3
如果我们多启动一个客户端则会有增加如下输出
count = 1
count = 2
count = 3
single输出的是
count = 1
count = 2
count = 3
增加一个客户端,输入变为
count = 4
count = 5
count = 6
还有一个 OperationBehavior应用于操作上的特性我们需要注意,它的 ReleaseInstanceMode指定了4个枚举值。默认是None,还有AfterCall,BeforeAndAfterCall,BeforeCall,如果应用了这个特性,则对象在调用这个方法时会检查OperationBehavior特性的ReleaseInstanceMode的值,它如果它指定为非none,则在调用根据设置的值来在调用前或后释放该对象。
demo下载
