WCF 会话服务 Session

本文详细介绍了WCF服务中的会话服务概念及其配置方法,包括如何通过绑定协议支持会话,不同绑定协议与会话特性的关系,以及如何设置服务行为来实现私有会话。同时探讨了会话服务在客户端和服务端的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
很悲哀,iis6只支持http相关协议,但http相关协议不支持session。如何选择binging才能让wcf支持session呢?
关于在iis7配置net.tcp相关,参见
http://blogs.msdn.com/rampo/archive/2007/10/29/how-do-i-set-binding-and-enable-protocols-for-non-http-transports-in-iis.aspx

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

配置私有会话

服务实例的默认激活方式为会话服务模式。我们也可以显示配置会话服务的方式,使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)],具体代码如下所示:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    
public class
WCFServicePerSession : IWCFService
     {
     }

服用要支持会话要依靠传输层的持久连接,例如NetTcpBinding会保持一个连接,而与连接无关的HTTP协议是因为无法保持连接,所以BasicHttpBinding是不支持会话的

WCF服务绑定协议与会话特性之间的关系见下表:

Binding

Session mode

Context mode

Async Dispose()

Instance mode

Basic

Allowed/NotAllowed

PerCall/PerSession

Yes

PerCall

TCP, IPC

Allowed/Required

PerCall

No

PerCall

TCP, IPC

Allowed/Required

PerSession

Yes

PerSession

WS (no security, no reliability)

NotAllowed/Allowed

PerCall/PerSession

Yes

PerCall

WS (with security or reliability)

Allowed/Required

PerSession

Yes

PerSession

WS (with security or reliability)

NotAllowed

PerCall/PerSession

Yes

PerCall


如果服务要跨越服务边界,那么就要在服务契约这一层使用ServiceContact的SessionMode属性,SessionMode为枚举类型:

public enum SessionMode
{
Allowed,
Required,
NotAllowed
}

SessionMode.Allowed

SessionMode.Allowed是SessionMode的默认属性,一个服务端方法被标记了SessionMode.Allowed属性,表示它是允许传输会话的,但并不强制要求绑定必须支持会话,而服务的行为是采用单调还是会话这要取决于服务的配置和使用的绑定

SessionMode.Required

SessionMode.Required 要求必须使用传输层会话,也就是说服务终结点的绑定一定得支持传输层会话,若要设计一个会话契约,我们还是使用SessionMode.Required而非SessionMode.Allowed

SessionMode.NotAllowed

SessionMode.NotAllowed指定契约永不使用传输会话,也不使用应用层会话,不管服务配置如何,总是采用单调服务方式。我们将一个契约标记SessionMode.NotAllowed以后,就不能使用NetTcpBinding等支持传输层会话的绑定,而如果像WSHttpBinding这样模拟传输层会话则是允许的,考虑到代码的可读性建议在使用SessionMode.NotAllowed时总是把服务配置为单调服务

一致性配置

为了方便,如果一个契约是会话契约那么最好把所有契约都配置为会话契约,要避免将单调服务于会话契约混合定义在相同的会话服务类型中

编写如下服务端代码

   [ServiceContract(SessionMode = SessionMode.Required)]
   interface IMyContract
   {
      [OperationContract]
      void MyMethod();
   }

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
   class MyService : IMyContract,IDisposable
   {
      int m_Counter = 0;

      public MyService()
      {
         MessageBox.Show("Counter = " + m_Counter,"MyService.MyService()");
      }
      public void MyMethod()
      {
         m_Counter++;
         string sessionID = OperationContext.Current.SessionId;
         Trace.WriteLine("Service session ID: " + sessionID);

         MessageBox.Show("Counter = " + m_Counter,"MyService.MyMethod()");
      }
      public void Dispose()
      {
         MessageBox.Show("Thread ID = " + Thread.CurrentThread.ManagedThreadId,"MyService.Dispose()");
      }
   }

 

客户端调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值