学习WCF之路6:会话

       会话,就是通信双方进行通信的一个时间片,通信双方彼此认识,一旦会话结束他们就会变成永远的陌生人。会话的特性符合客户端和服务端需要通信多次才能完成的要求,在这个期间双方需要记住彼此,而且会话也是很多其他特性实现的基础。

建立会话的条件:

(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,也就是说服务端忘记了之前调用的客户端,当他第二次调用的时候重新分配一个新的计数器,因此每次都是1.


总结:

(1) 是否支持会话首先取决于选择的绑定。

(2) 是否支持会话通过配置服务协定的ServiceContract属性的SessionMode属性实现的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值