次の属性をサービス クラスに追加します。
<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">