1.什么是Instancing modes?
通过上图我们可以了解到,客户端每次向WCF服务发送请求的时候,会首先在WCF服务端生成一个服务实例,然后通过服务实例来回应客户端的请求。因此Instancing modes 就表示服务实例在服务器上持久的时间长短,有三种方式。
2.PerCall
不管客户端是否相同,针对于每一次的请求,都会创建一个新的服务实例
特点
A.一个方法用完以后立即释放,能够节约内存
B.高并发不是问题
C.灵活性好
D.状态不能维持在不同的请求中
E.性能可能是一个问题,因为每次的请求都会重新构造一个新的服务实例
3.PerSession
在一次客户端的会话中,创建一个新的服务实例,并在此会话中保存此实例
特点
A.可以保持状态在不同的会话
B.在一个会话期间,非常的消耗内存。并且也会影响应用的可扩展性
4.Single
在针对于所有的请求中,就创建一个实例,不管客户端是否相同
特点
A.一个单利的服务实例回应所有的客户端的请求
B.并发是个问题
C.当请求多时,处理慢时,会产生请求队列,会延迟当前的进程。
5.实例讲解
上述三种状态的修改也非常的简单,参照下面的Demo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace SimpleService
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“SimpleService”。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class SimpleService : ISimpleService
{
private int _number;
public int IncrementNumber()
{
_number = _number + 1;
return _number;
}
}
}
6.问题汇总
1.不是所有的bingding都支持session。例如BasicHttpBinding就不支持
2.如何控制WCF服务Session超时?
<bindings>
<wsHttpBinding>
<!--设置超时的时间-->
<binding receiveTimeout="00:00:10" name="mex">
<!--产生的sessionid将会一致-->
<reliableSession enabled="true"/>
</binding>
</wsHttpBinding>
</bindings>
3.当遇到WCF服务超时时,如何解决?
当遇到超时异常时,只需要添加判断,并创建新的服务实例即可。
private void button1_Click(object sender, EventArgs e)
{
try
{
MessageBox.Show("text is" + client.IncrementNumber());
}
//接受超时异常
catch (System.ServiceModel.CommunicationException)
{
//判断超时异常
if (client.State == System.ServiceModel.CommunicationState.Faulted)
{
MessageBox.Show("create new one");
//创建信息的服务实例
client = new Simple.SimpleServiceClient();
}
}
}