Domanda

Sto usando VSTS 2008 + C # + .NET 3.0. Sto utilizzando un servizio WCF autonomo. Quando si esegue la seguente istruzione, esiste il seguente "vincolo non trovato" errore. Ho pubblicato il mio intero file app.config, qualche idea su cosa sia sbagliato?

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

Messaggio di errore:

  

Impossibile trovare un indirizzo di base che corrisponda allo schema http per il   endpoint con associazione MetadataExchangeHttpBinding. Base registrata   gli schemi di indirizzo sono [https].

Configurazione app completa:

<?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>
È stato utile?

Soluzione

L'indirizzo di base per il tuo servizio definisce " HTTPS: // " - ma il tuo indirizzo messicano è " HTTP " ;.

Se desideri che il tuo servizio utilizzi https: //, dovrai utilizzare anche 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

Altri suggerimenti

Posso scegliere il doppio punteggio? :)

Mentre stai usando WS-Http stai vincolando ad un protocollo HTTPS, quindi devi usare la corretta associazione MEX;

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

Ho fatto una domanda in un commento & nbsp; per Marc_s answer

  

È possibile avere IMetadataExchange sia per http che per https come   endpoint separati?

& nbsp; & nbsp marc_s; rispose & nbsp;

  

dovresti essere in grado di definire un secondo indirizzo base, per http: // e   usalo per l'endpoint http mex.

Quindi la soluzione è dichiarare più endpoint & nbsp; con lo SAME & nbsp; address = " mex " e diversi attacchi come i seguenti

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

Di recente ho scoperto che è più semplice avere un interruttore di configurazione che può essere utilizzato per abilitare MEX in test e disabilitarlo in Live.

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

  

È possibile utilizzare la classe & nbsp; ServiceHostFactory & nbsp; per creare una personalizzazione   derivato da ServiceHost in Internet Information Services   (IIS & nbsp; ServiceHost personalizzato che aggiunge ServiceMetadataBehavior, (che   abilita la pubblicazione di metadati), anche se questo comportamento non è esplicitamente   aggiunto nel file di configurazione del servizio.

     

& nbsp; Scrivi il codice imperativo che abilita la pubblicazione dei metadati una volta e   quindi riutilizzare quel codice su diversi servizi. Questo è   realizzato creando una nuova classe che deriva da & nbsp; ServiceHost & nbsp; e   sovrascrive il metodo & nbsp; ApplyConfiguration () per aggiungere imperativamente il metodo   comportamento di pubblicazione dei metadati.

Codice di esempio tratto da Articolo MSDN dell'host di servizi personalizzati

//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");
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top