2009-06-22 17 views
15

Ich verwende VSTS 2008 + C# +. NET 3.0. Ich verwende einen selbst gehosteten WCF-Dienst. Wenn die folgende Anweisung ausgeführt wird, gibt es den folgenden "binding not found" Fehler. Ich habe meine ganze app.config-Datei gepostet, irgendwelche Ideen, was ist falsch?Mex Bindungsfehler in WCF

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

Fehlermeldung:

kann nicht eine Basisadresse finden, die mit der Bindung MetadataExchangeHttpBinding Schema http für den Endpunkt übereinstimmt. Registrierte Basis Adressschemas sind [https].

Voll 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> 

Antwort

44

Die Basisadresse für Ihren Dienst definiert "https: //" - aber Ihre mex-Adresse ist "HTTP".

Wenn Sie Ihren Dienst wollen https: // verwenden, müssen Sie die mexHttpsBinding auch verwenden:

<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> 

Marc

+0

Ist es möglich, IMetadataExchange sowohl für HTTP und HTTPS als separate Endpunkte zu haben? Was sollten sie ansprechen? –

+0

Meine Frage war über http: und https, nicht über net.tcp Protokoll. –

+0

@MichaelFreigeid: Entschuldigung - falsch gelesen. Aber das gleiche gilt: Sie sollten in der Lage sein, eine zweite Basisadresse für "http: //" zu definieren und diese für den http mex-Endpunkt zu verwenden. –

12

Kann ich für die doppelte Punktzahl gehen? :)

Da Sie WS-Http verwenden, sind Sie an ein HTTPS-Protokoll gebunden, so dass Sie die richtige MEX-Bindung verwenden müssen;

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

ich eine Frage in einem Kommentar für Marc_sanswer

gefragt habe, ist es möglich, IMetadataExchange sowohl für HTTP und HTTPS als getrennte Endpunkte zu haben?

marc_s beantwortet

sollten Sie eine zweite Basisadresse, für http definieren können: // und verwenden, die für den HTTP-mex Endpunkt.

So Lösung ist mehrere Endpunkte mit derselben Adresse = „mex“ und verschiedenen Bindungen wie folgt

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

zu erklären Vor kurzem fand ich, dass es einfacher ist, einen Konfigurationsschalter zu haben, der sein kann verwendet, um MEX beim Testen zu aktivieren und bei Live zu deaktivieren.

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

Es ist möglich, die Servicehost Klasse zu verwenden, um einen benutzerdefinierten von Servicehost im (IIS benutzerdefinierten Servicehost Internet Information Services abgeleitet zu erstellen, die die ServiceMetadataBehavior fügen hinzu (die ermöglicht Metadaten-Publishing), auch wenn dieses Verhalten nicht explizit in der Konfigurationsdatei des Dienstes hinzugefügt wird.

Schreiben Sie den Imperativ-Code, der das einmalige Publizieren von Metadaten ermöglicht, und verwenden Sie diesen Code dann über mehrere verschiedene Dienste hinweg wieder. Dies ist erreicht durch Erstellen einer neuen Klasse, die von ServiceHost abgeleitet ist und überschreibt die ApplyConfiguration() -Methode, um unbedingt das Metadatenveröffentlichungsverhalten hinzuzufügen.

Beispielcode von Custom Service Host MSDN article

//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"); 
    } 
} 
Verwandte Themen