2

WCFを不適切に実装している可能性がありますが、NetNamedPipedBindings何度も呼び出しを行った後、使用中にWCF例外が発生しているようです。

これが私がしていることのハイレベルです。基本的に、私はproc exeの外で作業しており、WCF名前付きパイプを使用して通信を行っています。この属性を使用して、ホストを開いたままにします。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple)]

次に、クライアントで、static DuplexChannelFactory一度インスタンス化してから、必要に応じて次の方法で使用するを作成します。

channelFactory.CreateChannel().MakeCall();

ホストが正しく機能していることを確認するために、Pingメソッドを追加しました(ホストは、知らないうちに見逃したくないイベントを送り返すため)。このPingメソッドは5秒に1回実行され、単にtrueを返します。ただし、数分間実行した後、私はを取得しTimeoutExceptionます。これが私の例外トレースです:

サーバースタックトレース:System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout)at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel、TimeSpan timeout)atSystem.ServiceModel.Channels。 System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.Call(String action、Boolean oneway、ProxyOperationRuntime operation、Object [] insでのServiceChannel.CallOnceManager.CallOnce(TimeSpanタイムアウト、CallOnceManagerカスケード) 、Object [] outs、TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.Call(String action、Boolean oneway、ProxyOperationRuntime operation、Object [] ins、Object [] outs)atSystem.ServiceModel.Channels.ServiceChannelProxy。System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessageメッセージ)でのInvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime操作)

JustDecompileを開いたところ、このエラーがここで発生している可能性が高いことがわかりました。

connection = this.connectionPoolHelper.EstablishConnection(timeout)

ただし、以前に2、3回pingを実行した後、これがタイムアウトになる理由はわかりません。これを無限にするためにどのような設定を設定する必要がありますか、および/またはクライアントまたはサーバー側からこのWCFイベントサーバー(オンデマンド処理にも使用されます)を実装する別の方法はありますか?

アップデート

呼び出しが試行され、戻りがないことを確認し始める前に、約6回pingを実行します。

4

2 に答える 2

2

問題は、何度も呼び出すことができないということでしたCreateChannel。これは私のWCFインターフェースの単なるプロキシであるため、disposeメソッドはありません。そこで、プロキシへの参照を保存し、ホストを再インスタンス化する必要がある場合はそれを再作成することで、これを解決しました。

あなたはこれについてある種の文書があると思うでしょう。CreateChannelを複数回呼び出すブログが書かれている場合は特に役に立ちません。

アップデート:

これがどのように解決されるべきかについて私が見つけたものです...それは私にとってはうまくいきませんでしたが..しかし他の人にとってはそうです

リンクが停止した場合にコードを切り取った:

IClientChannelにキャストするusingを使用してから、using内で参照をリセットする必要があります。チャネルは適切に閉じますが、参照は開いたままになります。キャストに注目してください

using (IClientChannel client = (IClientChannel)channelFactory.CreateChannel())
{
    var proxy = (IMyInterface)client;
}
于 2012-05-02T21:23:12.810 に答える
0

sysinternalsのPipeListを使用して、新しいパイプを不必要に作成し続けるかどうかを確認する必要があります。それらはGUIDとして表示されます。WCF名前付きパイプの命名規則の詳細については、MSDNブログを参照してください。

于 2012-05-02T20:40:17.163 に答える