błąd wiązania mex w WCF

Używam VSTS 2008 + C# +. Net 3.0. Korzystam z hostowanej przez siebie usługi WCF. Podczas wykonywania następującej instrukcji występuje następujący błąd "nie znaleziono powiązania". Opublikowałem całą aplikację.plik konfiguracyjny, jakieś pomysły co jest nie tak?

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

Komunikat o błędzie:

Nie można znaleźć adresu bazowego, który pasuje do schematu http dla punkt końcowy z wiążącym MetadataExchangeHttpBinding. Zarejestrowana baza Schematy adresowe to [https].

Pełne 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>
Author: Amro, 2009-06-22

3 answers

Adres bazowy dla Twojej usługi definiuje "HTTPS: / /" - ale twój adres mex to "HTTP".

Jeśli chcesz, aby Twoja usługa używała https://, musisz również użyć 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>

Marc

 45
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 11:13:13

Czy Mogę dostać Podwójny wynik? :)

Ponieważ używasz WS-Http, jesteś związany z protokołem HTTPS, więc musisz użyć poprawnego powiązania MEX;

<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
 13
Author: blowdart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 08:59:43

Zadałem pytanie w komentarzu do Marc_s odpowiedź

Czy możliwe jest posiadanie IMetadataExchange dla http i https jako oddzielne punkty końcowe?

Marc_s odpowiedział

Powinieneś być w stanie zdefiniować drugi adres bazowy, dla http:// i użyj tego dla punktu końcowego HTTP mex.

Więc rozwiązaniem jest zadeklarowanie wielu punktów końcowych z tym samym adresem = " mex " i różnych wiązań, takich jak po

<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óry może być używany do włączania MEX na test i wyłączania NA ŻYWO.

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

Możliwe jest użycie klasy ServiceHostFactory do utworzenia niestandardowego pochodzące z usług serwisowych w internetowych serwisach informacyjnych (IIS Custom ServiceHost, który dodaje ServiceMetadataBehavior, (który umożliwia publikowanie metadanych), nawet jeśli takie zachowanie nie jest jawne dodany w pliku konfiguracyjnym serwisu.

Napisać kod imperatywny, który umożliwia publikowanie metadanych raz i następnie ponownie użyj tego kodu w kilku różnych usługach. To jest realizowane poprzez stworzenie nowej klasy, która wywodzi się z ServiceHost i nadpisuje metodę ApplyConfiguration (), aby bezwzględnie dodać zachowanie publikowania metadanych.

Przykładowy kod 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");
    }
}
 3
Author: Michael Freidgeim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:45