Question

J'utilise VSTS 2008 + C # + .NET 3.0. J'utilise un service WCF auto-hébergé. Lors de l’exécution de l’instruction suivante, il existe le "lien non trouvé" suivant: Erreur. J'ai posté tout mon fichier app.config, des idées sur ce qui ne va pas?

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

Message d'erreur:

  

Impossible de trouver une adresse de base correspondant au schéma http pour le   noeud final avec liaison MetadataExchangeHttpBinding. Base enregistrée   les schémas d'adresses sont [https].

App.config complet:

<?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>
Était-ce utile?

La solution

L'adresse de base de votre service définit " HTTPS: // " - mais votre adresse mex est "HTTP".

Si vous souhaitez que votre service utilise https: //, vous devez également utiliser 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

Autres conseils

Puis-je tenter le double score? :)

Lorsque vous utilisez WS-Http, vous vous associez à un protocole HTTPS. Vous devez donc utiliser la liaison MEX appropriée.

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

J'ai posé une question dans un commentaire pour Marc_s answer

  

Est-il possible d’utiliser IMetadataExchange pour http et https en tant que   points de terminaison distincts?

& nbsp; marc_s & nbsp; répondu & nbsp;

  

vous devriez pouvoir définir une deuxième adresse de base, pour http: // et   utilisez-le pour le point de terminaison http mex.

La solution consiste donc à déclarer plusieurs & nbsp; points de terminaison avec SAME & nbsp; adresse = " mex " et différentes comme ci-dessous

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

Récemment, j'ai constaté qu'il était plus facile de disposer d'un commutateur de configuration permettant d'activer MEX lors du test et de le désactiver sous Live.

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

  

Il est possible d'utiliser la classe & nbsp; ServiceHostFactory & nbsp; pour créer une   dérivé de ServiceHost dans Internet Information Services   (IIS & nbsp; ServiceHost personnalisé qui ajoute le ServiceMetadataBehavior (qui   permet la publication de métadonnées), même si ce comportement n'est pas explicitement   ajouté dans le fichier de configuration du service.

     

& nbsp; Écrivez le code impératif permettant la publication des métadonnées une fois   puis réutilisez ce code sur plusieurs services différents. C'est   accompli en créant une nouvelle classe dérivée de & nbsp; ServiceHost & nbsp; et   redéfinit la méthode ApplyConfiguration () pour ajouter impérativement le   comportement de publication des métadonnées.

Exemple de code extrait de article MSDN de l'hôte de service personnalisé

//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");
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top