我正在使用NetTcpBinding编写双工WCF服务,我遇到了一个架构问题,我认为我知道答案,但希望我错了
我们的服务是有状态的,我们选择了PerSession
InstanceContextMode
的NetTcpBinding。由于各种原因,这是我们需要的。我正在尝试将我们更大的接口(其中大块操作不适用于许多客户端)分解为多个较小的接口,并将操作逻辑分组。虽然单个服务实现很容易实现所有合同,但我不确定是否可以让多个服务合同共享一个通道(或者更符合我要求的是,单个会话),我肯定需要能够做到这一点才能使这项工作。
当然,我可以在一个合同中包含所有内容并在执行无效操作时抛出FaultException
,但我真的希望能够打破这些并且甚至不添加不适用的端点合同。我正在寻找什么?
TL; DR版本:
我需要能够做到这一点:
[ServiceContract]
public interface IServiceA
{
[OperationContract]
void Foo();
}
[ServiceContract]
public interface IServiceB
{
[OperationContract]
void Bar();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class Service : IServiceA, IServiceB
{
...
}
并且能够从客户端到服务建立一个会话,但同时使用IServiceA
和IServiceB
。
答案 0 :(得分:4)
会话通道上的默认实例提供程序将为您提供每个连接的实例。但是,您可以扩展instance provider以从您自己的缓存中获取现有对象并返回相同的对象。
如何关联实例将取决于您使用某些特殊的消息头等。每个代理的底层通道/连接将不同,并且还使用不同的缓冲区/并发模型,但您可以允许服务模型使用相同的实例。 http://msdn.microsoft.com/en-us/magazine/cc163590.aspx