2017-07-26 76 views
0

私たちは.NetリモーティングからWCFに移行しています。 IPCは、できるだけ事前にIPCを使用していました。名前付きパイプによるWCF二重通信

私たちはWCFと.NETリモート処理に持った最初の「サービス」を複製しようとしました。

我々はクライアントに転送する必要があるサーバー上のいくつかのイベントを持った前。クライアントは、そのようなイベントを通知するプロキシを提供していました。

WCFでは、私は二重通信を使用する必要があることを理解しているので、ServiceContractCallBackContractと指定しました。

しかし、今、私はそれを使用しようとしている、私はエラーのような種類を取得:

契約は、両面が必要ですが、「NetNamedPipeBinding」をバインドする サポートそれかはに適切に構成されていないいませんそれをサポートする。

は私が何か間違ったことをしましたか?あるいは、私たちは本当に双方向のコミュニケーションを取ることができません。これは.NETリモートでは可能だが、WCFではできないとは思えない。

EDITここ

は私の構成です

サーバー側:

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{...} 
+0

コールバックの使用はバインディングによって異なります。しかし、「NetNamedPipeBinding」は、[ここ](http://www.dotnettricks.com/learn/wcf/understanding-various-types-of-wcf-bindings)に示されているように二重化をサポートしています。だから私は問題があなたの設定から来なければならないと思う。コールバックの設定はややこしいことがあります。あなたの実装と両側のconfigsを見せてください。 – Rabban

+0

@Rabban私たちの実装からすべてを取り出してここに入れました。私が気づいたことの1つは、SessionModeと同じ問題があることです(インターネットでいくつかの例を見ている間はサポートされていないと言っています) – J4N

+0

最初の視点では、デュプレックスの設定と似ています。 'MaxBufferPoolSize'や' MaxReceivedMessageSize'などの問題は 'Int32.MaxValue'のみで、' Int64'では使用できません。これは問題の根源になる可能性があります。同じ、またはそれが予測できない動作を引き起こす可能性があり – Rabban

答えて

0

WCFは、トランスポートモードと二重通信ストリーミングをサポートしていません。ちょうど別の輸送モードを使用してください。

関連する問題