web-dev-qa-db-ja.com

httpおよびhttpsバインディング/エンドポイントの両方でWCFサービスを展開する

Silverlightアプリで使用するWCF Webサービスを作成しました。最初は、サービスは基本的なhttpバインディングのみを必要としました。ここで、httpとhttpsの両方で使用するサービスをデプロイできる必要があります。次のように、これを可能にするweb.configの設定をいくつか見つけました。

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="SilverlightFaultBehavior">
        <silverlightFaults />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior name="CxtMappingWebService.CxtMappingWebServiceBehavior">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="True" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="SecureHttpBinding">
        <security mode="Transport" />
      </binding>
      <binding name="BasicHttpBinding">
        <security mode="None" />
      </binding>
    </basicHttpBinding>
  </bindings>
  <services>
    <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior">
      <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
      <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
  </services>
</system.serviceModel>

しかし残念ながら、これには問題があります。

このWebサービスは、何百ものお客様のサーバーに展開する必要があり、すべてがhttpsを使用するわけではありません。 IISでhttpsバインディングが設定されていないサーバーにそれをデプロイすると、失敗します。デフォルトでは、web.configにこれらのバインディングを両方とも持たせる方法はありません。 IISでhttpsバインディングが設定されていない場合に死にますか?

この問題の解決策は考えられますが、実際の展開要件にはあまり適していません。

他の誰かが以前にこのような何かに遭遇したことがあり、どのようにそれを解決しましたか?

26
Zann Anderson

インストーラーを使用しない場合、このページで承認された回答はあまり役に立ちません。正しい答えは、OP自身による後の編集にあります。必要なことは、httpポートとhttpsポートの両方をIISにバインドしてから、以下の構成を使用することです。

            <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior">
              <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
              <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            </service>

それは私にとってはうまくいきました!

最後に、web.configのbindings、behaviours、およびservicesセクションにconfigSource属性を使用して、次のように外部ファイルを使用することにしました。

<bindings configSource="bindings.config" />
<behaviors configSource="behaviors.config" />
<services configSource="services.config" />

このように、デフォルトでhttpアクセス専用に設定された外部ファイルを使用してデプロイし、httpsアクセス用に設定する外部ファイルを編集する方法について顧客に指示(または支援)します。これにより、外部の構成ファイルを上書きせずに、web.config自体に将来の変更をデプロイすることもできます。

10
Zannjaminderson

これは、サービスのデプロイに使用するインストーラーによって処理されます。両方のエンドポイントまたはhttpエンドポイントのみをデプロイすることは、前提条件である(または少なくともインストーラーのオプションを残す)必要があります。

4
Johann Blais

2つのエンドポイントのURIが同じです。これはWCFでは許可されていません。異なるバインディングでエンドポイントを指定できるはずですが、URIは異なる必要があります(つまり、異なるポート番号または異なるコントラクト)。

1
jonnyb