Je souhaite que le service WCF-over-TCP fonctionne. J'avais quelques problèmes avec la modification de mon propre projet, alors j'ai pensé que je commencerais par le modèle WCF "de base" inclus dans VS2008.mexTcpBinding dans les erreurs WCF - IMetadataExchange
Voici la première WCF App.config et quand je lance le service du client test WCF peut travailler avec elle bien:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfTcpTest/Service1/" />
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="WcfTcpTest.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfTcpTest.Service1Behavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Cela fonctionne parfaitement, aucun problème du tout.
je me suis dit le changer de HTTP TCP serait trivial: changer les liaisons à leurs équivalents TCP et de supprimer l'élément httpGetEnabled serviceMetadata:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:1337/Service1/" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" contract="WcfTcpTest.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfTcpTest.Service1Behavior">
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Mais quand je lance ce je reçois cette erreur dans le service WCF Hôte:
System.InvalidOperationException: le nom du contrat 'IMetadataExchange' est introuvable dans la liste des contrats implémentés par le service Service1. Ajoutez un ServiceMetadataBehavior au fichier de configuration ou au ServiceHost directement pour activer la prise en charge de ce contrat. J'ai l'impression que vous ne pouvez pas envoyer de métadonnées en utilisant TCP, mais c'est le cas pourquoi existe-t-il une option mexTcpBinding?
Merci! C'est ce qu'il a fait. Je ne pense pas que la configuration de WCF ait été conçue à ce moment-là. App.config est un fichier de configuration, j'ai supposé que lorsqu'un élément de configuration a été supprimé, cela signifie simplement "Je ne définis explicitement aucune configuration" et non "Désactiver cette fonctionnalité". Un meilleur moyen serait le suivant: –
Dai
@David: eh bien, c'est une option dont on pourrait discuter pendant longtemps. WCF utilise simplement l'approche "si ce n'est pas là, ce n'est pas actif". Une fois que vous le savez, tout va bien et a beaucoup de sens (vous n'avez pas à le mettre dedans et à activer/désactiver pour le désactiver). –