Pregunta

Estoy usando VSTS 2008 + C # + .NET 3.0. Estoy usando un servicio WCF autohospedado. Al ejecutar la siguiente instrucción, existe el siguiente enlace "no encontrado" error. He publicado todo mi archivo app.config, ¿alguna idea de qué está mal?

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

Mensaje de error:

  

No se pudo encontrar una dirección base que coincida con el esquema http para   punto final con enlace MetadataExchangeHttpBinding. Base registrada   los esquemas de direcciones son [https].

Configuración completa de la aplicación:

<?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>
¿Fue útil?

Solución

La dirección base para su servicio define "HTTPS: //" - pero su dirección mex es " HTTP " ;.

Si desea que su servicio use https: //, también deberá usar 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

Otros consejos

¿Puedo ir por el doble puntaje? :)

Como está utilizando WS-Http, está vinculando un protocolo HTTPS, por lo que debe utilizar el enlace MEX correcto;

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

He hecho una pregunta en un comentario & nbsp; para Marc_s answer

  

¿Es posible tener IMetadataExchange para http y https como   puntos finales separados?

& nbsp; marc_s & nbsp; respondió & nbsp;

  

debería poder definir una segunda dirección base, para http: // y   utilízalo para el punto final http mex.

Entonces, la solución es declarar múltiples & nbsp; puntos finales con la MISMA & nbsp; address = " mex " y enlaces diferentes, como los siguientes

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

Recientemente descubrí que es más fácil tener un interruptor de configuración que se pueda usar para habilitar MEX en la prueba y deshabilitar en Live.

De & nbsp; http://msdn.microsoft.com/en-us /library/aa395224.aspx

  

Es posible usar la clase & nbsp; ServiceHostFactory & nbsp; para crear una clase personalizada   derivado de ServiceHost en los servicios de información de Internet   (IIS & nbsp; ServiceHost personalizado que agrega ServiceMetadataBehavior, (que   habilita la publicación de metadatos), incluso si este comportamiento no es explícitamente   agregado en el archivo de configuración del servicio.

     

& nbsp; Escriba el código imperativo que permite la publicación de metadatos una vez y   luego reutilice ese código en varios servicios diferentes. Esto es   logrado mediante la creación de una nueva clase que deriva de & nbsp; ServiceHost & nbsp; y   anula el método & nbsp; ApplyConfiguration () para agregar obligatoriamente el   comportamiento de publicación de metadatos.

Código de ejemplo de Artículo de MSDN del host de servicio personalizado

//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");
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top