IISでWCF net.pipeバインディングをホストするときに名前付きパイプの名前を制御する
-
05-07-2019 - |
質問
httpおよびnet.pipeを介してアクセス可能なサービスがあります。 IIS 7(Server 2008)でホストされています。同じマシン上で複数の顧客向けにこのサービスの異なるインスタンスをホストしている可能性があるため、HTTPは仮想ホスト名などでセットアップされています。これはすべて正常に機能しています。
ネットの名前付きパイプバインディングについても同様のことをすると思いました。 名前付きパイプベースアドレスの顧客「仮想ホスト名」、したがって私を許可する 異なるnet.pipe urnsを使用して異なる顧客インスタンスにアクセスする( net.pipeの名前はURLではなくURNであるため、本質的には任意ですが、 HTTPアドレスと同様のパターンに従うと思いました)。
これは私のweb.config
です<service name="Administration" behaviorConfiguration="AdministrationBehavior">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="normalWsBinding" contract="IAdministration" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<endpoint address="" binding="netNamedPipeBinding" bindingConfiguration="normalNetNamedPipeBinding" contract="IAdministration" />
<endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://virtualhostname.com/service" />
<add baseAddress="net.pipe://virtualhostname.com/administration/service" />
</baseAddresses>
</host>
</service>
ただし、 サービスのWSDLにアクセスするとき-net.pipeのベースアドレスは IISによって無視されます。代わりに、マシンの実際のホスト名を取得し、 IISによって完全にフォーマットされたと思われるnet.pipeアドレスURN。
<wsdl:port name="NetNamedPipeBinding_IAdministration" binding="tns:NetNamedPipeBinding_IAdministration">
<soap12:address location="net.pipe://realhostname/service/Administration.svc"/>
<wsa10:EndpointReference>
<wsa10:Address>net.pipe://realhostname.com/service/Administration.svc</wsa10:Address>
<Identity>
<Spn>host/realhostname.com</Spn>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
net.pipeの名前の形成方法を制御できないため、私は区別できません マシン上の複数のカスタマーサービスインスタンス間。誰にもどのように手がかりがありますか ネットの名前付きパイプバインドURNは、IIS環境内で制御できますか?
(テスト中に多くのスタンドアロンのnet.pipeホスティングを行います(つまり、新しいServiceHost()) したがって、net.pipeバインディングはIISの外部で機能し、制御を許可することを知っています 正確な名前付きパイプURNを使用)
名前をIIS内で制御できない場合-誰でも経験がありますか 同じ上の複数の個別のnet.pipeサービスインスタンスをホストおよびアクセスする マシン?
解決
これは古い質問ですが、これに対する答えも必要だったので、自分の答えを追加すると思いました(そして、それを必要とする他の人もいるかもしれません)。
IISがホストするWCFサービスのベースアドレスはIISによって制御され、web.configで上書きできません。代わりに、サービスをホストしているサイトのIISサイトバインド情報を更新することにより、ベースアドレスを制御できます。
私がオンラインで見つけたドキュメントのほとんどは、net.pipeのバインディング構成として*を使用することを提案しています。ただし、代わりに&quot; virtualsite.com&quot;を使用すると、バインディング構成値として、net.pipeエンドポイントのベースアドレスは「virtualsite.com」になります。マシン名ではなく。
appcmdを使用して、正しいnet.pipeバインディングを使用してIISのサイトを構成する例を次に示します。
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.pipe',bindingInformation='virtualhostname.com']
HostnameComparisonMode に関する1つのメモ、 MSDN :
これらの値は、インターネットインフォメーションサービス(IIS)またはWindowsプロセスアクティブ化サービス(WAS)ホスティング環境内で使用した場合、効果がありません。このような場合、WCFは、WCFサービスをホストするIIS Webサイトによって提供されるホスト名比較モードを使用します。
代わりに、上記のメカニズムを使用する必要があります。 IISのHTTPでホスト名バインディングがどのように機能するかを調査することで、これを理解しました。残念ながら、他のWCFトランスポートに関するこのIISベースのシナリオの公式ドキュメントを見つけることができませんでした。
他のヒント
URIのホスト名部分は無視され、チャネルバインディングのHostNameComparisonModeに基づいた実装に置き換えられているようです。これを「完全一致」に変更してみてください。サービスの設定経由...
NetNamedPipeBinding.HostnameComparisonMode URIの照合時にホスト名を使用してサービスに到達するかどうかを示すHostnameComparisonMode値。デフォルト値はStrongWildcard()で、一致するホスト名は無視されます。
ここで構成構文を参照してください。 http://msdn.microsoft.com/en-us/library/ms731291。 aspx