19

これについて多くの投稿があることを理解しており、検索で出てきたすべての投稿を調べて、言及されているすべてを実装しました. HTTP のローカル システムで動作する WCF Web サービスがあり、HTTP のサーバーで動作しました。ただし、クライアントでは、これが HTTPS 経由で機能する必要があります。このサイトや他のサイトへの無数の投稿は、これが本来あるべきほど単純ではないことを示しています。これまで、ASMX Web サービスは「機能した」だけであり、複雑な構成は必要ありませんでした。

現在の構成で次のエラーが発生します。

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

これが役に立たないように構成するために何日も試みた後、現時点での私のコードは次のとおりです。

<system.serviceModel>

    <!--     -->
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="true" >
        <baseAddressPrefixFilters>
            <add prefix="https://mysite.com"/>
            <add prefix="http://mysite.com"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>

    <!-- Set up Custom Behaviors -->    
    <behaviors>

        <endpointBehaviors>
        </endpointBehaviors>

        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>

    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>

        <wsHttpBinding>
            <binding    name="SOAPBinding" 
            >

                <security mode="Transport">
                </security>
            </binding>
        </wsHttpBinding>

    </bindings>

    <services>

        <service    
                    behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                    name="WebPostService.WebPostService"
        >

    <host>
      <baseAddresses>
        <add baseAddress="https://mysite.com/Services/WebPostService.svc"/>
      </baseAddresses>
    </host>
            <endpoint   address="" 
                        binding="wsHttpBinding" 
                        bindingConfiguration="SOAPBinding"
                        contract="WebPostService.IWebPostService"
            >
                <identity>
                    <dns value="mysite.com" />
                </identity>
            </endpoint>

            <endpoint   
                        address="mex" 
                        binding="mexHttpsBinding" 
                        contract="IMetadataExchange" 
            >
            </endpoint>

        </service>

    </services>

</system.serviceModel>

私は何を間違っていますか? HTTPS でこれを機能させるにはどうすればよいですか? これが本来あるべきほど単純ではないことに不満を感じています。私はこのプロジェクトに取り組んでいる数か月間、MSDN の WCF ドキュメントに埋もれており、サービス、エンドポイント、およびバインディングを十分に把握しています。

更新: まだこれに取り組んでいますが、mex アドレスの完全な URL を入力しようとすると、奇妙なエラーが発生しました。私はこれに変更しました:

address="https://prcwebs.com/Services/WebPostService.svc/mex" 

エラーが発生しました:

このサービスのセキュリティ設定には Windows 認証が必要ですが、このサービスをホストする IIS アプリケーションでは有効になっていません。

Windows 認証を使用しようとしていません。セキュリティ設定は変更されておらず、まだ設定されています

<セキュリティ モード="トランスポート" />

WebHttpBinding をバインドするエンドポイントのスキーム https に一致するベース アドレスが見つかりませんでした。登録されたベース アドレス スキームは [http] です - 役に立ちませんでした。何も言及されて いません 結合 WSHttpBinding を持つエンドポイントのスキーム http に一致するベース アドレスが見つかりませんでした - トランスポート セキュリティを使用していますが、これは適用されません。さまざまなセキュリティ モードに変更しようとしましたが、サイトを機能させることができませんでした。

4

4 に答える 4

4

に追加multipleSiteBindingsEnabled="true"してserviceHostingEnvironmentセキュリティを更新し、クライアント クレデンシャルを無効にします。

<security mode="Transport">
    <transport clientCredentialType="None"></transport>
</security>

EDIT Windows 2003での私の最終的な作業バージョンは、次の構成でした。

<system.serviceModel>
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="false" />

    <!-- Set up Custom Behaviors -->    
    <behaviors>
        <endpointBehaviors>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>
        <wsHttpBinding>
            <binding name="SOAPBinding">
                <security mode="Transport">
                  <transport clientCredentialType="None"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>

    <services>
        <service behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                 name="WcfService2.Service1">

            <host>
                <baseAddresses>
                    <add baseAddress="https://localhost/Service/Service1.svc"/>
                </baseAddresses>
            </host>
            <endpoint address="" 
                      binding="wsHttpBinding" 
                      bindingConfiguration="SOAPBinding"
                      contract="WcfService2.IService1">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>

            <endpoint address="mex" 
                      binding="mexHttpsBinding" 
                      contract="IMetadataExchange">
            </endpoint>
        </service>
    </services>
</system.serviceModel>

https で Web サイトにアクセスできるので、インストールの証明書部分は正しいと思います。私の設定と比較したいものがあれば教えてください。

于 2013-01-30T20:32:06.380 に答える
3

HTTPS に間違ったバインディングを使用しています。

2 つの別個のバインディング クラスがあります。wsHttpBinding と wsHttpsBinding は s. バインディングの下に HTTPS 用の wsHttpsBinding を追加する必要があり、そのバインディング用の新しいエンドポイントが必要です。

また、通常表示される特定のエラーは、IIS がその場所から https 用にセットアップされていないかどうかを確認します。

  • IIS マネージャーを開く
  • オープンサイト
  • [既定の Web サイト] を右クリックします。
  • バインディングの編集
  • https と http のエントリがあることを確認します。

  • IIS マネージャーを開く
  • アプリケーションを見つけます (デフォルトの Web サイトになると思います)。
  • 右クリック
  • ウェブサイト/アプリケーションの管理
  • 高度な設定
  • 有効なプロトコル
  • http、https
于 2013-02-01T16:48:02.873 に答える
3

私はこれを使用しましたが、うまくいきました。多分それはあなたを助けることができます

WCF の WsHttp バインディングで Https を有効にするには、web.config ファイルでいくつかの簡単な手順を変更する必要があります。

それらの手順は次のとおりです。

サービスの web.config ファイルでトランスポート レベルのセキュリティを有効にします。

この手順では、セキュリティ モードを none から Transport に変更する必要があります。以下のコードは、その方法を示しています。

<bindings>
    <wsHttpBinding>
        <binding name="TransportSecurity">
            <security mode="Transport">
                <transport clientCredentialType="None"/>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

バインディングを結び、HTTPS 構成を指定する

ここで、バインド (プレビュー ステップ) をエンド ポイントに関連付ける必要があります。bindingConfiguration タグを使用してバインディング名を指定します。サービスがホストされているアドレスも指定する必要があります。以下のコードは、それを行う方法を示しています

<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior">
<!-- Service Endpoints -->
    <endpoint address=https://localhost/WCFWSHttps/Service1.svc binding="wsHttpBinding"  bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>

. また、serviceMetaData で httpGetEnabled を httpsGetEnabled に変更する必要があります。以下のコードは、その方法を示しています。

<serviceMetadata httpsGetEnabled="true"/> 

それが役に立ったことを願っています

于 2013-02-08T09:19:36.783 に答える
0

私は3.5設定であなたの正確な構成を使用しました、そしてそれはLuukの答えで以下に述べられるようにTransport使用するモードで動作します。clientCredentialType="None"ただし、念のため、ここの情報から収集できる限り多くの環境をシミュレートするために、サンプルプロジェクトを作成しました。

環境をシミュレートするために、IIS(7.5)を標準のAsp.Net 2.0 Integratedアプリプールを使用するように設定しました。「スキームの問題ごとに1つのアドレスしか持てない」ことをシミュレートするために、3つのhttpバインディングと3つのhttpsバインディングを追加baseAddressPrefixFiltersしました。

検索してに置き換えただけmysite.comですlocalhost。以下は、スクリーンショットの作成に使用した正確な構成のコピーペーストです。

web.config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" />
    <authentication mode="None"/>
    <customErrors mode="Off"/>
  </system.web>
  <system.serviceModel>
    <!--     -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
      <baseAddressPrefixFilters>
        <add prefix="https://localhost"/>
        <add prefix="http://localhost"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <!-- Set up Custom Behaviors -->
    <behaviors>
      <endpointBehaviors/>
      <serviceBehaviors>
        <behavior name="WebPostService.WebPostServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- Set up the binding configuration  -->
    <bindings>
      <wsHttpBinding>
        <binding name="SOAPBinding">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WebPostService.WebPostServiceBehavior" name="WebPostService.WebPostService">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost/Services/WebPostService.svc"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SOAPBinding" contract="WebPostService.IWebPostService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>

結果は次のとおりです。

スクリーンショット

完全なURLWebPostService.svcで2回表示されることに気付くでしょう。代わりにドロップするmex必要があります(または完全にドロップアウトしても、私の側では正常に機能します)httpsGetUrlmexWebPostService.svc/mex

これについて、またはIISバージョン以外の環境間で何が異なる可能性があるかについて話し合いたい場合は、ほぼ1日中(さらに5〜6時間)WPFチャットルームにいます。

于 2013-02-07T12:16:24.057 に答える