10

私は WCF サービスの開発者です。私のテストクライアントはそれで非常にうまく機能します。しかし、実際のクライアント (同じクライアント プロキシを使用) に関しては、失敗します。同じ WCF サービスが netTcpBinding で動作します。このエラーは、ConcurrencyMode = ConcurrencyMode.Single でも、netNamedPipeBinding でのみ発生します。

ここに例外があります

メッセージを受け入れることができる net.pipe://localhost/MyService でリッスンしているエンドポイントはありませんでした。これは、多くの場合、アドレスまたは SOAP アクションが正しくないことが原因です。詳細については、InnerException (存在する場合) を参照してください。

サーバー スタック トレース: で

System.ServiceModel.Channels.PipeConnectionInitiator.GetPipeName(Uri uri) System.ServiceModel.Channels.NamedPipeConnectionPoolRegistry.NamedPipeConnectionPool.GetPoolKey(EndpointAddress アドレス、Uri 経由) で System.ServiceModel.Channels.CommunicationPool`2.TakeConnection(EndpointAddress アドレス、Uri 経由) 、TimeSpan タイムアウト、TKey& キー) で System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan タイムアウト) で System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan タイムアウト) で System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan タイムアウト) でSystem.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan タイムアウト) で System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan タイムアウト) で System.ServiceModel.Channels.ServiceChannel。CallOnceManager.CallOnce(TimeSpan タイムアウト、CallOnceManager カスケード)
System.ServiceModel.Channels.ServiceChannel.EnsureOpened (TimeSpan タイムアウト) で System.ServiceModel.Channels.ServiceChannel.Call (文字列アクション、ブール値一方向、ProxyOperationRuntime 操作、Object[] ins、Object[] outs、TimeSpan タイムアウト) で System. System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage メッセージ) での ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime 操作)

[0] で例外が再スローされました: System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) で

内部例外

PipeException: "パイプ エンドポイント 'net.pipe://localhost/MyService' がローカル マシンで見つかりませんでした。"

4

3 に答える 3

22

スタック トレースは、サービスによって使用されている名前付きパイプの実際の名前をサービス URL から取得しようとしたときに、クライアント側の WCF チャネル スタックが失敗したことを示しています。サービスは、そのフィールドの 1 つとして GUID を含む名前付き共有メモリ セクションに小さな構造体を配置することにより、パイプ名 (サービスが再起動するたびに変更される GUID) を発行します。共有メモリ セクションに使用される名前は、NetNamedPipeBinding のサーバー側とクライアント側の両方の WCF コードにコンパイルされるアルゴリズムを適用することによって、サービス URL から派生します。

質問で報告された例外は、アルゴリズムをサービス URL に適用して名前を作成した後、クライアント側のコードがその名前の共有メモリ セクションへのハンドルを開くことができなかったことを意味します。これは、例外メッセージが示すように、名前の派生に使用されたサービス URL をリッスンしているサービスがないことを意味する場合があります。ただし、代わりに、メモリ セクションがあり、サービスもあるが、クライアント側のコードが共有メモリへのアクセスを許可するセキュリティ コンテキストで実行されていないことを意味する場合があります。

Vista より前の Windows プラットフォームでは、WCF クライアントが共有メモリを開き、そこからパイプ名 GUID を読み取り、サービスのパイプに正常に接続するためのセキュリティ アクセス許可を欠いている可能性はほとんどありません。しかし、Vista 以降のプラットフォームでは、これをより一般的な障害シナリオにする新しいセキュリティ メカニズムがあります。

Vista では、名前付きカーネル オブジェクトに異なる名前空間の概念が導入されました。グローバル (マシン全体) の名前空間と、ログオン セッションごとのプライベート名前空間があります。NetNamedPipeBinding クライアント コードは、パイプ名をアドバタイズする共有メモリ セクションを探すときに、両方の名前空間を試します。サーバーがグローバル名を使用して共有メモリを作成した場合、またはサービスとクライアントが同じログオン セッションで実行されている場合、クライアントは探しているものを見つけます。ただし、サービスがグローバル名前空間でオブジェクトを作成できない場合 (常にこれを最初に作成しようとします)、プライベート セッション名前空間の作成にフォールバックし、同じセッションで実行されているクライアントのみが参照できるようになります。それ。グローバル名前空間カーネル オブジェクトを作成するには、Vista 以降のプラットフォームで特別な権限が必要です。これは通常、「管理者として」実行されている Windows サービス プロセスとアプリケーションだけが持っています。一般的な落とし穴は、対話型ユーザー セッションで実行されているアプリケーションでホストされている WCF NetNamedPipe サービスに接続しようとする Windows サービスでクライアントを作成しようとすることです。

クライアント コードが、サービスをホストするコードよりも低い整合性コンテキスト (ブラウザー プラグインなど) で実行されている場合、Vista の必須整合性メカニズムは、WCF NetNamedPipeBinding サービスに接続する推定クライアントを防止することもできます。

質問で報告された、テストクライアントは機能しているが実際のクライアントが機能していないという症状は、これらの理由のいずれかにより、実際のクライアントのセキュリティコンテキストがサービスホストのセキュリティコンテキストと一致していないことがほぼ確実に原因であると思います.

于 2012-06-29T21:23:03.420 に答える
7

このエラーを検索してこの投稿に出くわした場合、この根本的な問題を修正する別の可能性があります。URLnet.pipeにアドレスが見つからないというエラーが発生した場合 (つまり、Net.Pipe Listener Adapter Windows サービスが開始されていることを確認http://localhost:1234/MyService/etc/してください) 。(Net.Tcp Listener Adapter も開始しました)

一部のシナリオでは、特にこれらのサービスを積極的に使用する多くの開発ツールがインストールされていない可能性のあるリモート サーバーに展開する場合、サービスが有効化または開始されていないように見えます。サービスを開始すると、問題が修正されました。

于 2013-03-28T20:22:50.383 に答える
3

クライアントが使用するエンドポイントは、WCFサービスによって公開されているエンドポイントと一致する必要があります。つまり、指定されたクライアントエンドポイントのアドレス/バインディング/コントラクトタプルは、WCFサービスによって公開されているエンドポイントのアドレス/バインディング/コントラクトタプルと正確に一致する必要があります。app.configアプローチを使用している場合は、WCFサービスとクライアント構成ファイルの両方ですべてのスペルが正しいことを確認してください。プログラムでエンドポイントを追加する場合は、コードのスペルを間違えていないことを確認してください。

于 2009-12-04T20:01:10.047 に答える