与命名管道

时间:2017-07-26 09:02:19

标签: c# wcf named-pipes

我们正在从.Net远程处理转移到WCF。我们之前使用的是IPC(因为我们有性能考虑)。

我试图用WCF复制我们在.Net远程处理上的第一个“服务”。

在我们在服务器上有一些必须转发到客户端的事件之前。客户端正在提供代理以告知此类事件。

在WCF中,我的理解是我们必须使用DUPLEX通信,因此我在CallBackContract上指定了ServiceContract

但是现在当我尝试使用它时,我会遇到这样的错误:

  

合同需要Duplex,但Binding'NetNamedPipeBinding'不需要   支持它或未正确配置以支持它。

我做错了什么吗?或者我们真的不能进行双向通信(除了查询响应)?我无法相信这在.Net Remoting中是可能的,但在WCF中却没有?

修改

以下是我的配置

服务器端:

Uri uri = new Uri("net.pipe://localhost/My/Service");
ServiceHost serviceHost = new ServiceHost(typeof(MyService),uri);

NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
binding.TransferMode= TransferMode.Streamed;
binding.Security.Transport.ProtectionLevel = ProtectionLevel.None;
binding.MaxBufferPoolSize = Int64.MaxValue;
binding.MaxBufferSize=Int32.MaxValue;
binding.MaxReceivedMessageSize=Int64.MaxValue;

ServiceEndpoint serviceEndpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IMyService)), binding, uri);
serviceEndpoint.EndpointBehaviors.Add(new ProtoEndpointBehavior());

serviceHost.AddServiceEndpoint(serviceEndpoint);

客户方:

Uri uri = new Uri("net.pipe://localhost/My/Service");
EndpointAddress address = new EndpointAddress(uri);
InstanceContext context = new InstanceContext(callBack);
m_channelFactory = new DuplexChannelFactory<IMyService>(context, binding, endpoint);
m_channelFactory.Endpoint.EndpointBehaviors.Add(new ProtoEndpointBehavior());
m_channelFactory.Faulted += OnChannelFactoryFaulted;
m_innerChannel = m_channelFactory.CreateChannel();

服务声明:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IMyServiceCallback))]
//Note I also tried without the SessionMode specified
    public interface IMyService: IService{...}

服务实施:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
    public class MyService: IMyService, IDisposable{...}

1 个答案:

答案 0 :(得分:0)

WCF不支持流传输模式的双工通信。只需使用其他传输模式。