2010-04-05 16 views
8

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?

Répondre

20

Eh bien, si vous voulez avoir des métadonnées - TCP ou HTTP - vous devez toujours inclure le comportement serviceMetadata!

<behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfTcpTest.Service1Behavior"> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
      <serviceMetadata /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

Bien sûr, vous ne pouvez pas avoir un « HttpGetEnabled » à ce sujet - mais le comportement lui-même doit être présent afin de permettre l'échange de métadonnées (et donc le contrat IMetadataExchange).

+0

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

+1

@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). –