他の場所で説明されているように、「net.pipe:// localhostでリッスンしているエンドポイントがありませんでした」というエラーが発生しますが、本当の答えが見つからないようです。
これは問題の優れた識別子です:http: //kennyw.com/indigo/102
WCFを使用する場合、Windows認証はSSPI-Negotiateを介して実行されます。これにより、ほとんどの場合、実際の認証メカニズムとしてKerberosが選択されます。ただし、SSPIに渡されるターゲットSPNがローカルコンピューターアカウント用の整形式SPN(例:host / [dns machine name])の場合、NegotiateはNTLM(ループバック最適化)を使用し、アクセストークンにはネットワークSIDがありません(およびしたがって、NetNamedPipesで使用できます)。
しかし、それは問題を解決する方法を教えてくれません。プログラムでエンドポイントを作成しています。
var binding = new NetNamedPipeBinding();
binding.Security.Mode = NetNamedPipeSecurityMode.Transport;
binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
var id = EndpointIdentity.CreateSpnIdentity("host/" + Environment.MachineName);
var endpointAddress = new EndpointAddress(new Uri(serviceClientUrl), id);
var client = new ServiceClient(binding, endpointAddress);
私の問題はCreateSpnIdentityにあると思いますが、どの値を使用すればよいかわかりません。
追加情報: より多くのコンテキストのためにこれについて詳しく説明します。Wcfサービスは、NetworkServiceアカウントで実行されているWindowsサービスとしてホストされています(ローカルシステムを試しました)。サービスは、デフォルトのNetNamedPipeBindingコンストラクターを使用して作成されます。
host.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "ServiceName");
このサービスを使用するSharePointWebパーツを作成しました。キッカーは、SharePointサイトがフォームベースの認証に設定されている場合、またはWindows認証のURLでマシン名のみが使用されている場合、問題はないということです。Windows認証でURLに完全修飾マシン名が使用されている場合にのみ、上記のエラーが発生します。
これは、記事で説明されているNTLM Kerberosの問題に関係していると確信していますが、回避方法がわかりません。