2009-06-22 14 views
15

Używam VSTS 2008 + C# + .NET 3.0. Używam samodzielnie hostowanej usługi WCF. Podczas wykonywania poniższej instrukcji występuje następujący błąd "nie znaleziono powiązania". Wysłałem cały mój plik app.config, jakieś pomysły, co jest nie tak?Błąd wiązania mex w WCF

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

Komunikat o błędzie:

nie można odnaleźć adres bazowy, który pasuje do schematu http dla końcowego z obowiązującymi MetadataExchangeHttpBinding. Zarejestrowane schematy adresów to [https].

Pełna 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> 

Odpowiedz

44

Adres bazowy dla usługi definiuje "https: //" - ale Twój adres mex jest "HTTP".

Jeśli chcesz, aby Twój serwis używać https: //, musisz użyć mexHttpsBinding także:

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

Marca

+0

Czy to możliwe, aby mieć IMetadataExchange zarówno http i https jako oddzielne punkty końcowe? Co należy im zająć? –

+0

Moje pytanie dotyczyło http: i https, a nie protokołu net.tcp. –

+0

@MichaelFreidgeim: przepraszam - źle odczytałem. Ale to samo dotyczy: powinieneś być w stanie zdefiniować drugi adres bazowy dla 'http: //' i użyć go dla http mex punktu końcowego. –

12

Mogę iść do podwójnego wynik? :)

Podczas korzystania z WS-Http wiążesz się z protokołem HTTPS, więc musisz użyć poprawnego powiązania MEX;

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

Poprosiłem pytanie w komentarzu do Marc_sanswer

Czy to możliwe, aby mieć IMetadataExchange zarówno http i https jako oddzielnych punktów końcowych?

marc_s odpowiedział

powinieneś być w stanie zdefiniować drugi adres bazowy dla http: // i użycie że dla http mex końcowym.

rozwiązanie Więc jest zadeklarować wiele punktów końcowych z tego samego adresu = „mex” i różne Wiązania jak na poniższym

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

Ostatnio odkryłem, że łatwiej jest mieć jeden przełącznik konfiguracji, które mogą być służy do włączania MEX podczas testu i wyłączenia na żywo.

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

Możliwe jest użycie klasy ServiceHostFactory aby utworzyć niestandardowy pochodzący z ServiceHost w Internet Information Services (IIS niestandardowych ServiceHost który dodaje ServiceMetadataBehavior, (który umożliwia publikowanie metadanych), nawet jeśli to zachowanie nie jest jawnie podane w pliku konfiguracyjnym usługi.

Napisz imperatywny kod, który umożliwia jednorazowe publikowanie metadanych i , a następnie użyj tego kodu w kilku różnych usługach. To jest osiągnięte przez utworzenie nowej klasy wywodzącej się z ServiceHost i przesłania metodę ApplyConfiguration() w celu bezwzględnego dodania zachowania publikacji metadanych .

Przykład kodu z 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"); 
    } 
} 
Powiązane problemy