web-dev-qa-db-ja.com

HttpおよびHttpsによるWebHttpBinding

ウェブサイトにhttpsとhttpを使用しようとしています。 Webサイトには、RESTサービスとして機能し、JavaScriptから呼び出される.svcファイルがあります。

私の構成:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="AjaxBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehaviour">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="true"/>         
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <services>
      <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups">
        <endpoint address="" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >         
        </endpoint>
        <endpoint address="" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >          
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>      
      <webHttpBinding>
        <binding name="httpsWebBinding">
          <security mode="Transport">
            <transport clientCredentialType="None" proxyCredentialType="None" />
          </security>
        </binding>
        <binding name="httpWebBinding">
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>   
  </system.serviceModel>

ブラウジング https://myserver/services/Lookups.svc/Hello

バインディングWebHttpBindingを使用するエンドポイントのスキームhttpに一致するベースアドレスが見つかりませんでした。登録されているベースアドレススキームは[https]です

ブラウジング http://myserver/services/Lookups.svc/Hello

バインディングWebHttpBindingを使用するエンドポイントのスキームhttpsに一致するベースアドレスが見つかりませんでした。登録されたベースアドレススキームは[http]です

エンドポイントを1つ削除しても機能します。 bindingConfiguration="httpWebBinding"で構成されたエンドポイントを削除する例はHTTPSで機能します

HTTPおよびHTTPSで動作させるにはどうすればよいですか?現在のところ、1つのエンドポイントを削除することで、httpまたはhttpsを使用できます。

参照 httpおよびhttpsの両方のWCFサービス構成を1つのweb.configに結合するにはどうすればよいですか? および HTTPおよびHTTPS WCF 4 RESTfulサービスをどのように設定しますか?

:IISでは、2つのWebサイトがhttpでリッスンし、もう1つはhttpsでリッスンします。両方が物理フォルダーで同じコードを共有している

UPDATE:現在のところ、エンドポイントを削除して動作しました。しかし、私の懸念は、behaviourConfigurationで構成されたエンドポイントを削除することは、私にとって素晴らしい解決策には見えません。

これはhttpとhttpsの両方で機能します

  <services>
      <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups">

      </service>
    </services>
12
Billa

シナリオを再作成し、web.configを使用してテストサービスのエンドポイントを構成しました。設定は問題なく、正しく機能します。機能しないのは、おそらくIISのhttps設定です。サービスへのhttpsアクセスが有効になっていることを確認してください。 Visual StudioのIISExpressでテストする場合は、プロジェクトを左クリックし、プロパティウィンドウ([表示]-> [プロパティウィンドウ])で[SSL有効= True]を選択します。

5
Lesmian

このコードを追加します。

<protocolMapping>
  <add scheme="http"  binding="webHttpBinding" bindingConfiguration="httpWebBinding"/>
  <add scheme="https" binding="webHttpBinding" bindingConfiguration="httpsWebBinding"/>
</protocolMapping>
0
hyunchul kim

@Lesmianが彼の回答で指摘したように、問題はあなたのIIS構成にあります。より具体的には:

注: IISでは、1つはhttpでリッスンし、もう1つはhttpsでリッスンする2つのWebサイトです。両方が物理フォルダーで同じコードを共有している

その理由は、IISがサポートしていないスキーマのエンドポイントを処理できないためです。

2つのサイトがあり、1つにはHTTPバインディングがありますがHTTPSはありません。もう1つにはHTTPSはありますがHTTPはありません。

したがって、http:// URLにアクセスすると、IISが(驚き!)http対応サイトに移動し、web.configを読み取り、登録されていることを確認します。 httpsエンドポイント(サイトではサポートされていません)http-enabled-でhttpsスキームがサポートされていないことを示す例外をスローしますサイトのみ。

https:// URLを参照すると、状況は似ています-IISでは、httpエンドポイントを使用できません- https-enabled-onlyサイト。

この問題を処理するには、2つのバインディングを持つ単一のサイトを使用することをお勧めします。

別の(そしてより複雑な)オプションは、サイトに異なるweb.configsを使用することです:(個別のフォルダーを指す)個別のサイトをセットアップし、Visual Studioのパブリッシングおよびweb.config変換ツールを使用します

0
morincer

このようなエンドポイント設定を更新する場合:

        <endpoint address="http://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >         
        </endpoint>
        <endpoint address="https://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >          
        </endpoint>

私はprodシステムで同じようなダンスをしましたが、これが私の解決策でした。それもあなたのために働くことを願っています。

0
Jake