9

パブリック IP でリッスンしているリバース プロキシの背後からプライベート LAN にある WCF Web サービスの WSDL を正しく提供するにはどうすればよいですか?

パブリック IP アドレスで要求をリッスンし、内部 IIS ホストから要求を処理するリバース プロキシ モードで構成された Apache Web サーバーがあります。WCF Web サービスは、LAN ホストの FQDN アドレスを使用して WSDL を生成します。これはもちろん、インターネット Web サービス クライアントによって読み取ることはできません。

ホスト アドレスを含む生成された WSDL をカスタマイズし、代わりにパブリック アドレスを配置するために、wcf アプリケーションの web.config または IIS で構成できる設定はありますか?

4

3 に答える 3

11

次の属性をサービス クラスに追加します。

<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>

これにより、サービスはクライアントによってアドレス指定されますhttps://...が、サービスは引き続きホストできますhttp://.....

コード属性を必要とせずに構成を通じて指定できる拡張機能を作成する方法については、宣言的に AddressFilterMode.Any を指定する方法に関する私の回答を参照してください。AddressFilterMode.Any

web.configサービス ホストの では、エンドポイント要素のaddress 属性に、クライアントが使用するパブリック URL である絶対 URL が含まれている必要があります。同じエンドポイント要素でlistenUri、サービス ホストがリッスンしている絶対 URL に属性を設定します。

ホストがリッスンしているデフォルトの絶対 URI を特定する方法は、サービスがホストされている物理サーバーを指すサービス参照をクライアント アプリケーションに追加することです。クライアントの web.config には、サービスのアドレスがあります。次に、それをホストの web.config の listenUri 属性にコピーします。

serviceMetaDataサービスの動作構成で、属性を持つ要素を追加しますhttpGetEnabled=true

したがって、次のようになります。

<serviceBehaviors>
  <behavior name="myBehavior">
    <serviceMetadata httpGetEnabled="true" />
  </behavior>
</serviceBehaviors>
<!--  ... -->
<services>
  <service name="NamespaceQualifiedServiceClass" behavior="myBehavior" >
    <endpoint listenUri="http://www.servicehost.com" 
              address="https://www.sslloadbalancer.com" 
              binding="someBinding" 
              contract="IMyServiceInterface" ... />
  </service>
</services>

これがメッセージ セキュリティまたはトランスポート セキュリティで機能するかどうかはわかりません。この特定のアプリケーションでは、資格情報が DataContract の一部として渡されたため、basicHttpBinding> security>がありmode=noneました。トランスポートは (ssl ロード バランサーに対して) 安全であるため、セキュリティ上の問題はありませんでした。

listenUri 属性を空白のままにすることもできますが、存在する必要があります。

残念ながら、WCF にはバグがあり、WSDL にインポートされたスキーマのベース アドレスには、パブリック ベース アドレス (エンドポイントの address 属性を使用して構成されたもの) ではなく、listenUri ベース アドレスが含まれます。この問題を回避するには、インポートされたスキーマを WSDL ドキュメントに直接取り込み、インポートを削除する IWsdlExportExtension 実装を作成する必要があります。

この例は、WCF を使用した WSDL でのインライン XSDに関するこの記事で提供されています。BehaviorExtensionElementさらに、サンプル クラスを次の 2 つの新しいメソッドから継承して完成させることができます。

Public Overrides ReadOnly Property BehaviorType() As System.Type
    Get
        Return GetType(InlineXsdInWsdlBehavior)
    End Get
End Property

Protected Overrides Function CreateBehavior() As Object
    Return New InlineXsdInWsdlBehavior()
End Function

これにより、.config ファイルに拡張動作を追加し、サービス ファクトリを作成するのではなく、構成を使用して動作を追加できます。

構成要素の下にsystem.servicemodel次を追加します。

<behaviors>
  <endpointBehaviors>
    <behavior name="SSLLoadBalancerBehavior">          
      <flattenXsdImports/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1-->
    <add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>        
  </behaviorExtensions>
</extensions>

そして、behaviorConfiguration 属性を使用して、エンドポイント構成で新しいエンドポイント動作を参照します

<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior">
于 2009-06-03T21:10:34.210 に答える
1

私も同様の問題を抱えています。その 1 つは、パブリック アドレスとサーバー アドレスの解決でした。これでその問題は解決しましたが、まだ認証の問題がいくつかあります。

参照: IIS でホストされるサービスの WSDL で HostName を変更する方法 ドン・ウェンロン

記録

于 2009-01-21T08:13:58.997 に答える
0

参照: Service Station WCF Addressing In Depth by Aaron Skonnard

アーカイブ リンク

于 2008-12-30T08:28:59.087 に答える