1

WCF NetNamedPipeBinding に問題があります。Windows XP マシンで Visual Studio 2008 を使用してサーバー コードとクライアント コードを実行すると、すべて正常に動作します。しかし、サーバーを Windows サービスとして展開し、クライアント アプリを Windows Server 2008 にインストールするとすぐに、コントラクト メソッドを使用しようとすると、クライアント エンドで TimeoutException が発生します。クライアントを正常に作成して開くことができるようですが、どのメソッドも呼び出すことができません。

サービス初期化コード:

Uri baseAddress = new Uri("http://localhost:8500/xNet/xNetService");
string address = "net.pipe://localhost/xNet/xNetService";

_xNetAPIServiceHost = new ServiceHost(typeof(xNetService), baseAddress);

NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
_xNetAPIServiceHost.AddServiceEndpoint(typeof(IServiceAPI), binding, address);

// Add a mex endpoint
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.HttpGetUrl = new Uri("http://localhost:8501/xNet/xNetService/mex");
_xNetAPIServiceHost.Description.Behaviors.Add(smb);

_xNetAPIServiceHost.Open();

クライアント初期化コード:

string address = "net.pipe://localhost/xNet/xNetService";

NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);

_serviceClient = new ServiceAPIClient(binding, new EndpointAddress(address));
_serviceClient.Open();

Windows サービスは「ローカル システム アカウント」として実行されます。何が問題なのか途方に暮れています。セキュリティ アカウントの問題なのか、それとも名前付きパイプが開いているのかさえわかりません。クライアント側を正常に作成して開くことができるので、少なくとも名前付きパイプが見つかったように見えると思います。TimeoutException がなければ、どのサービス メソッドも呼び出すことができません。

4

1 に答える 1

0

さまざまなバインディングを試し、基本に戻った後、サンプルプログラムが機能していることに気付きましたが、Visual Studioを使用してデバッグしない限り、機能しませんでした。その時点で、それは自分のコードで起こっていることであるに違いないと判断しました。デバッグを簡素化するために、バインディングのすべてのセキュリティをオフにしました。

何が起こっているのかを判断するために、サービスのOnStartメソッドのほとんどのステートメントをコメントアウトし始めました。ServiceHostを初期化するコードを除いてすべてコメントアウトしました。魔法のように、私のクライアントはサービスと正常に通信できるようになりました。次に、クライアントが突然TimeoutExceptionを再度表示し始めるまで、OnStartメソッドのコードの各行のコメントを解除し始めました。

私のサービスクラス、たとえば「MyAPI」は、コントラクト「IMyAPI」を実装します。WCFサービスとして「MyAPI」クラスを使用するだけでなく、サービスの内部で「MyAPI」クラスのインスタンスを使用して、さまざまなこと(「内部」メソッド)を実行していました。OnStartメソッドでは、最初に「MyAPI」クラスのインスタンスを作成し、次にServiceHostを作成しました。

MyAPI API = new MyAPI();

ServiceHost service = new ServiceHost(typeof(MyAPI));

エラーや例外が発生していなかったため、問題はないように見えましたが、実際にはクライアントを使用してサービスに接続できませんでした。上記のステートメントの順序を変更するとすぐに、クライアントは再び動作を開始しました。

ServiceHost service = new ServiceHost(typeof(MyAPI));

MyAPI API = new MyAPI();

なぜこれが発生するのかわかりませんが、私が知っているのは、クライアント接続の問題なしに、APIを内部およびサービスとして使用できることだけです。たぶん、そこにいる誰かがこの背後にある理由についていくつかの光を提供するか、あるいは私のコードが適切に設計されていないのかもしれません。

于 2011-12-20T06:54:53.797 に答える