16

VSTS 2008 + C# + .NET 3.0 を使用しています。セルフホステッド WCF サービスを使用しています。次のステートメントを実行すると、次の「バインディングが見つかりません」というエラーが発生します。app.config ファイル全体を投稿しましたが、何が問題なのですか?

ServiceHost host = new ServiceHost(typeof(MyWCFService));

エラーメッセージ:

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

完全な app.config:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="MyBinding"
            closeTimeout="00:00:10"
            openTimeout="00:00:20"
            receiveTimeout="00:00:30"
            sendTimeout="00:00:40"
            bypassProxyOnLocal="false"
            transactionFlow="false"
            hostNameComparisonMode="WeakWildcard"
            maxReceivedMessageSize="100000000"
            messageEncoding="Mtom"
            proxyAddress="http://foo/bar"
            textEncoding="utf-16"
            useDefaultWebProxy="false">
          <reliableSession ordered="false"
               inactivityTimeout="00:02:00"
               enabled="true" />
          <security mode="Transport">
            <transport clientCredentialType="Digest"
               proxyCredentialType="None"
               realm="someRealm" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="MyWCFService"
                behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyBinding" contract="IMyService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mexServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
4

3 に答える 3

48

サービスのベース アドレスは「HTTPS://」を定義しますが、mex アドレスは「HTTP」です。

サービスで https:// を使用する場合は、 mexHttpsBindingも使用する必要があります。

<services>
    <service name="MyWCFService" behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" 
                binding="wsHttpBinding" 
                bindingConfiguration="MyBinding" 
                contract="IMyService" 
        />
        <endpoint address="mex" 
                binding="mexHttpsBinding" 
                contract="IMetadataExchange" 
        />
    </service>
</services>

マルク

于 2009-06-22T08:57:46.250 に答える
14

ダブルスコアに行けますか?:)

WS-Httpを使用しているため、HTTPSプロトコルにバインドしているため、正しいMEXバインディングを使用する必要があります。

<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
于 2009-06-22T08:59:43.830 に答える
4

Marc_sの 回答に対するコメントで質問しました

httpとhttpsの両方のIMetadataExchangeを別々のエンドポイントとして使用することは可能ですか?

 marc_sが答えた 

http://用に2番目のベースアドレスを定義し、それをhttpmexエンドポイントに使用できるはずです。

したがって、解決策は、同じaddress="mex"と次のような異なるバインディングを使用して複数のエンドポイントを宣言することです。

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

最近、テストでMEXを有効にし、Liveで無効にするために使用できる構成スイッチを1つ持つ方が簡単であることがわかりました。

http://msdn.microsoft.com/en-us/library/aa395224.aspxから 

ServiceHostFactoryクラスを使用して、インターネットインフォメーションサービスのServiceHostから派生したカスタムを作成することができます(この動作がサービスの構成ファイルに明示的に追加されていない場合でも、ServiceMetadataBehaviorを追加するIISカスタムServiceHost(メタデータ発行を有効にします)。

 メタデータ発行を一度有効にする命令型コードを作成してから、そのコードを複数の異なるサービスで再利用します。これは、ServiceHostから派生し、ApplyConfiguration()メソッドをオーバーライドして、メタデータ発行動作を強制的に追加する新しいクラスを作成することによって実現されます。

カスタムサービスホストMSDN記事のサンプルコード

//Add a metadata endpoint at each base address
//using the "/mex" addressing convention
foreach (Uri baseAddress in this.BaseAddresses)
{
    if (baseAddress.Scheme == Uri.UriSchemeHttp)
    {
        mexBehavior.HttpGetEnabled = true;
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexHttpBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeHttps)
    {
        mexBehavior.HttpsGetEnabled = true;
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexHttpsBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeNetPipe)
    {
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexNamedPipeBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeNetTcp)
    {
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexTcpBinding(),
                                "mex");
    }
}
于 2012-12-17T19:50:16.833 に答える