昨夜遭遇した問題が 2 つありますが、現在は解決していますが、なぜ私が行ったことでそれらの問題が解決したのかについては 100% 確信が持てません。運がなかった!
最初の問題
最初の問題は、2 つの別々のプログラムにある 2 つの一意の名前のパイプがあったことです。
- net.pipe://localhost/superuniquepipe1
- net.pipe://localhost/superuniquepipe2
ただし、起動する 2 番目のプログラムは、アドレスが既に使用されているため、ServiceHost を開くときに例外をスローします (AddressAlreadyInUseException だったと思います)。
これらの ServiceHosts をインスタンス化する方法は次のとおりです。
Uri[] baseAddresses = new Uri[] { new Uri("net.pipe://localhost") };
this.host = new ServiceHost(this, baseAddresses);
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "superuniquepipe1");
this.host.Open();
したがって、最初に localhost のベース アドレスを指定し、次にエンドポイントを追加するときに残りのアドレスを指定します。これを解決する方法は、次のようにコードを変更することでした。
this.host = new ServiceHost(this);
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "net.pipe://localhost/superuniquepipe2");
this.host.Open();
これが機能した理由は、追加しようとしていたエンドポイントではなく、ベース アドレスのみをチェックしていたからだと言うのは正しいですか? また、2 番目のコード サンプルは、複数のプログラムが "localhost" でリッスンするための有効で安全な方法ですか?
2番目の問題:
上記の問題を解決するために、ベース アドレスを localhost から、「net.pipe://rawrwhyisntthisworkingsadface」などのさまざまな一意の文字列に変更しましたが、これを行うと、試行中のクライアントから InvalidCredentialException が表示されます。接続を確立する (以下のコードを参照)
名前付きパイプは文字通り何にでも名前を付けることができるという印象を受けましたが、誰かがこれに光を当てることができますか?
ChannelFactory<IHostType> factory = new ChannelFactory<IHostType>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://rawrwhyisntthisworkingsadface/superuniquepipe2"));
IHostType proxy = factory.CreateChannel();
proxy.CallSomeMethodAndGetAnException();
問題を解決したので、私の解決策が機能した理由を知りたいだけなので、どんな意見でも大歓迎ですが、私が解決した方法に欠陥があり、それを行うためのより良い方法を提案できる場合は、そうしてください:)