2

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

4

2 回答 2

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;

绑定波纹管也是无会话的,因为默认情况下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

于 2012-07-10T03:29:21.523 回答
3

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

对于会话模式的三个值:

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

该属性的MSDN 页面的备注部分包含有关此属性的更多信息。

于 2012-07-09T22:25:30.753 回答