erreur de liaison mex dans WCF
-
06-07-2019 - |
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>
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");
}
}