任何人都可以在 WCF 中告诉我如何在 SessionMode.Allowed 中创建会话或无会话通道。这意味着允许使用 WCF 服务进行两种类型的对话。谢谢。
2 回答
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;
绑定波纹管也是无会话的,因为默认情况下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 元素实现了 WS-ReliableMessaging 规范,提供对可靠会话的支持
- System.ServiceModel.NetMsmqBinding 绑定提供 MSMQ 数据报会话。
如果绑定实现了上述任何功能,您的服务将是全会话的。
有关详细信息,请参阅 MSDN - http://msdn.microsoft.com/en-us/library/ms733040.aspx
我假设您的意思是[ServiceContract]属性上的SessionMode属性。如果是这种情况,我认为您对合同中会话的概念有误解。通道是否是会话的取决于用于创建通道的绑定。该属性用于在运行时验证该合约的端点正在使用适当的绑定。SessionMode
对于会话模式的三个值:
- 必需:这意味着在合约的端点中使用的绑定必须支持会话。如果一个绑定不支持会话,那么客户端第一次使用时会抛出,或者服务主机会在Open期间抛出
- NotAllowed:相反:如果端点中使用的绑定确实支持会话,则运行时将抛出(在打开服务或客户端时)
- Allowed:默认值,合约可用于所有绑定,无论它们是否支持会话。
该属性的MSDN 页面的备注部分包含有关此属性的更多信息。