私は 2 つの Web サイトを持っています。1 つは aspx ファイル、もう 1 つは 2 つのエンドポイントを持つ wcf サービス、もう 1 つは http ともう 1 つは名前付きパイプです。どちらも同じマシンで実行されるため、net.pipe バインディングを使用する候補のように見えました。
aspx ファイルはサービス クライアントを作成し、net.pipe の呼び出しを試みます。そして、私はこれを取得します:
「'/dev' アプリケーションでサーバー エラーが発生しました。エンドポイント アドレス 'net.pipe://localhost/netNamedPipeBinding' のサービスがアドレスのプロトコルで利用できないため、メッセージをディスパッチできませんでした。」
グーグルは、これがセキュリティ上の問題である可能性があることを示唆しています (権限エラーがないことは、リスナーエラーがないことと同じです)。
aspx を含むサイトはフォーム認証 (Windows 認証ではない) を使用しており、サービス Web サイトは匿名認証です。web.config の net.pipe セキュリティは ="None" に設定されています
ローカルでは、これは問題なく動作しますが、Visual Studio Dev Server は名前付きパイプを実行できないため、コンソール アプリで名前付きパイプ ホストを実行する必要があります。また、HTTP エンドポイントは IIS で正常に動作します。
.NET 4.0、IIS 7.5、Win2008 を実行しています。
IIS Config 私が知る限り、
- サービス Web サイトで net.pipe が有効になっており、構成情報は * です。
- WAS がインストールされ、有効になっている (Windows 機能経由)
- net.pipe リスナー Windows サービスが有効になっています。
- 各 Web サイトは匿名アクセスです (認証はサードパーティのシングル サインオン サーバーによって行われます)。
- 各 Web サイトには独自のアプリ プールがあります (おそらく関係ありません)。
- サービス サイトは Web ガーデン モードです (おそらく関係ありません)
Service Config (同じマシンの IIS で実行、異なる VDIR)
<system.serviceModel>
<bindings>
<netNamedPipeBinding>
<binding name="netNamedPipeBindingConfig" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport protectionLevel="EncryptAndSign" />
</security>
</binding>
</netNamedPipeBinding>
</bindings>
<services>
<service name="MyService">
<host>
<baseAddresses>
<add baseAddress="net.pipe://localhost/" />
</baseAddresses>
</host>
<endpoint
address="netNamedPipeBinding"
bindingConfiguration="netNamedPipeBindingConfig"
binding="netNamedPipeBinding"
contract="IMyService" >
</endpoint>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
クライアント構成(ASP.NET Web サイト、同じマシン、サービスとは異なる VDIR)
<system.serviceModel>
<bindings>
<netNamedPipeBinding>
<binding name="NetNamedPipeBinding_IMyService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport protectionLevel="EncryptAndSign" />
</security>
</binding>
</netNamedPipeBinding>
</bindings>
<client>
<endpoint
address="net.pipe://localhost/netNamedPipeBinding"
binding="netNamedPipeBinding"
bindingConfiguration="NetNamedPipeBinding_IMyService"
contract="MyService.IMyService"
name="NetNamedPipeBinding_IMyService">
</endpoint>
</client>
</system.serviceModel>
(罪のない人を守るためにサービスと契約の名前が変更されました)
C# は特別なものではなく、Add-Service-Reference によって生成されたプロキシです。(そして、すべてのコードは wsHttp バインディングで正常に動作します