私たちは.NetリモーティングからWCFに移行しています。 IPCは、できるだけ事前にIPCを使用していました。名前付きパイプによるWCF二重通信
私たちはWCFと.NETリモート処理に持った最初の「サービス」を複製しようとしました。
我々はクライアントに転送する必要があるサーバー上のいくつかのイベントを持った前。クライアントは、そのようなイベントを通知するプロキシを提供していました。
WCFでは、私は二重通信を使用する必要があることを理解しているので、ServiceContract
にCallBackContract
と指定しました。
しかし、今、私はそれを使用しようとしている、私はエラーのような種類を取得:
契約は、両面が必要ですが、「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{...}
コールバックの使用はバインディングによって異なります。しかし、「NetNamedPipeBinding」は、[ここ](http://www.dotnettricks.com/learn/wcf/understanding-various-types-of-wcf-bindings)に示されているように二重化をサポートしています。だから私は問題があなたの設定から来なければならないと思う。コールバックの設定はややこしいことがあります。あなたの実装と両側のconfigsを見せてください。 – Rabban
@Rabban私たちの実装からすべてを取り出してここに入れました。私が気づいたことの1つは、SessionModeと同じ問題があることです(インターネットでいくつかの例を見ている間はサポートされていないと言っています) – J4N
最初の視点では、デュプレックスの設定と似ています。 'MaxBufferPoolSize'や' MaxReceivedMessageSize'などの問題は 'Int32.MaxValue'のみで、' Int64'では使用できません。これは問題の根源になる可能性があります。同じ、またはそれが予測できない動作を引き起こす可能性があり – Rabban