会话,就是通信双方进行通信的一个时间片,通信双方彼此认识,一旦会话结束他们就会变成永远的陌生人。会话的特性符合客户端和服务端需要通信多次才能完成的要求,在这个期间双方需要记住彼此,而且会话也是很多其他特性实现的基础。
建立会话的条件:
(1)支持会话的绑定。不同的绑定对会话的支持是不同的,之前一致使用的wsSHttpBinding就是支持会话的。
(2)服务协定支持会话。该部分需要使用到修饰服务协定的ServiceContract属性,该属性中的SessionMode属性就是用来配置服务协定是否支持会话的。
SessionMode有三个可能的值:
1) Allowed:这是默认值,表示这个服务协定是允许会话的,客户端可以选择用会话连接,也可以选择不用会话连接。
2) Required:表示服务协定要求客户端连接必须使用会话。
3) NotAllowed:表示服务协定不允许使用会话连接。
例子:
(1)在IIS上挂载服务
SessionMode.cs代码内容:
using System;
using System.ServiceModel;
namespace LearnWCF
{
[ServiceContract(SessionMode=SessionMode.Allowed) ]
public interface IHelloWCF
{
[OperationContract]
string PHelloWCF();
}
public class HelloWCF:IHelloWCF
{
private int _Counter;
public string PHelloWCF()
{
_Counter++;
return "Hello!You called " + _Counter.ToString() + " times";
}
}
}
把SessionMode设置为了Required,这表示调用这个服务协定的客户端必须使用会话。
web.config代码内容:
<configuration>
<system.serviceModel>
<services>
<service name="LearnWCF.HelloWCF" behaviorConfiguration="metadataExchange">
<endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>
<endpoint address="mex" binding="wsHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataExchange">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
SessionMode.svc代码内容:
<%@ServiceHost
language="c#"
Debug="true"
Service="LearnWCF.HelloWCF"
%>
这部分内容与之前的几乎一致,就是服务的实现部分为了体现会话的特性有所不同。
(2)客户端调用
添加服务引用后,编写代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SessionMode_client
{
class Program
{
static void Main(string[] args)
{
SessionMode_client.SessionMode.HelloWCFClient client = new SessionMode.HelloWCFClient();
Console.WriteLine(client.PHelloWCF());
Console.WriteLine(client.PHelloWCF());
client.Close();
Console.ReadLine();
}
}
}
(3)保存运行后,结果如下:
我们可以看到提示调用了两次,也就是说会话使服务端记住了客户端,当他第二次调用的时候将将计数器加一,就返回了调用两次。
(4)如果将SessionMode改成NotAllowed,其他不变,结果如下:
总结:
(1) 是否支持会话首先取决于选择的绑定。
(2) 是否支持会话通过配置服务协定的ServiceContract属性的SessionMode属性实现的。