创建无会话或会话频道

时间:2012-07-09 15:47:25

标签: wcf

任何人都可以在WCF中告诉我如何在SessionMode.Allowed中创建会话或无会话通道。这意味着允许两种类型的WCF服务对话。感谢。

2 个答案:

答案 0 :(得分:4)

SessionMode仅描述您的服务合同,但未实现所需行为。 SessionMode.Allowed告诉每个人服务在会话和没有会话时工作正常。在绑定中定义使用或不使用会话。

不同类型的绑定提供不同的功能集。某些功能需要/包括会话支持。

您可以对同一个合同使用多个绑定,并且一个绑定将在其他绑定不同时实现会话。

例如,下面的代码创建了会话通道,因为WSHttpBinding实现了消息安全性。

EndpointAddress address = new EndpointAddress("http://localhost/servicemodelsamples/service.svc");
WSHttpBinding binding = new WSHttpBinding();
ChannelFactory<ICalculator> factory = new 
                    ChannelFactory<ICalculator>(binding, address);
ICalculator channel = factory.CreateChannel();

添加此行将使Channel无会话:

binding.Security.Mode = SecurityMode.None;

Binding bellow也是无会话的,因为BasicHttpBinding默认实现SecurityMode.None

BasicHttpBinding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress("http://localhost/MathService/Ep1");
ChannelFactory<IMath> myChannelFactory = new ChannelFactory<IMath>(myBinding, myEndpoint);

基于安全性的会话不是WCF支持的唯一会话类型。 WCF支持4种不同类型的会话:

  • 基于安全的会话,通信的两端都有 同意一个特定的安全对话。
  • 基于TCP / IP的会话,以确保所有消息都相关联 套接字级别的连接。
  • System.ServiceModel.Channels.ReliableSessionBindingElement element,实现WS-ReliableMessaging规范, 为可靠的会议提供支持
  • System.ServiceModel.NetMsmqBinding绑定提供MSMQ数据报 会话。

如果绑定实现了上述任何功能,您的服务将是sessionfull。

有关详细信息,请参阅MSDN - http://msdn.microsoft.com/en-us/library/ms733040.aspx

答案 1 :(得分:2)

我假设您的意思是SessionMode属性上的[ServiceContract]属性。 如果是这种情况,我认为你对合同中的会话概念有误解。通道是否会话取决于用于创建通道的绑定。 SessionMode属性用于在运行时验证该合同的端点是否使用了适当的绑定。

对于会话模式的三个值:

  • 必需:这意味着合同的端点中使用的绑定必须支持会话。如果绑定不支持会话,则客户端将在第一次使用时抛出,或者服务主机将在打开期间抛出
  • NotAllowed :相反:如果端点中使用的绑定支持会话,则运行时将抛出(在打开服务或客户端时)
  • 允许:默认值,合同可用于所有绑定,无论他们是否支持会话。

该属性的MSDN page的备注部分提供了有关此属性的更多信息。