2009-08-12 7 views
17

J'ai une application de console client qui parle à un service WCF et j'obtiens l'erreur suivante: "Le serveur n'a pas fourni de réponse significative, cela peut être dû à une non-concordance de contrat, à une fermeture de session prématurée ou une erreur interne du serveur. "Problème d'incompatibilité de contrat WCF

Je pense que c'est à cause d'une discordance de contrat mais je n'arrive pas à comprendre pourquoi. Le service fonctionne très bien par lui-même et les 2 parties travaillaient ensemble jusqu'à ce que j'ai ajouté le code d'emprunt d'identité.

Quelqu'un peut-il voir ce qui ne va pas?

Voici le client, tout se fait dans le code:

NetTcpBinding binding = new NetTcpBinding(); 
binding.Security.Mode = SecurityMode.Message; 
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

EndpointAddress endPoint = new EndpointAddress(new Uri("net.tcp://serverName:9990/TestService1")); 
ChannelFactory<IService1> channel = new ChannelFactory<IService1>(binding, endPoint); 
channel.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation; 
IService1 service = channel.CreateChannel(); 

Et voici le fichier de configuration du service WCF:

<configuration> 
    <system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="MyBinding"> 
      <security mode="Message"> 
      <transport clientCredentialType="Windows"/> 
      <message clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WCFTest.ConsoleHost2.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceAuthorization impersonateCallerForAllOperations="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="WCFTest.ConsoleHost2.Service1Behavior" 
      name="WCFTest.ConsoleHost2.Service1"> 
     <endpoint address="" binding="wsHttpBinding" contract="WCFTest.ConsoleHost2.IService1"> 
      <identity> 
      <dns value="" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <endpoint binding="netTcpBinding" bindingConfiguration="MyBinding" 
      contract="WCFTest.ConsoleHost2.IService1" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://serverName:9999/TestService1/" /> 
      <add baseAddress="net.tcp://serverName:9990/TestService1/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    </system.serviceModel> 
</configuration> 

Répondre

1

Ok, je viens de changer le client il utilise un fichier de configuration à la place du code et j'obtiens la même erreur!

code:

ServiceReference1.Service1Client client = new WCFTest.ConsoleClient.ServiceReference1.Service1Client("NetTcpBinding_IService1");  
client.PrintMessage("Hello!"); 

Voici le fichier de configuration du client, fraîchement généré par le service ... ce qui me fait penser qu'il pourrait ne pas être une erreur d'incompatibilité de contrat

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <netTcpBinding> 
       <binding name="NetTcpBinding_IService1" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
        hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
        maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" 
        maxReceivedMessageSize="65536"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Message"> 
         <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
         <message clientCredentialType="Windows" /> 
        </security> 
       </binding> 
      </netTcpBinding> 
      <wsHttpBinding> 
       <binding name="WSHttpBinding_IService1" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Message"> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" 
          algorithmSuite="Default" establishSecurityContext="true" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://servername:9999/TestService1/" binding="wsHttpBinding" 
       bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1" 
       name="WSHttpBinding_IService1"> 
       <identity> 
        <dns value="&#xD;&#xA;   " /> 
       </identity> 
      </endpoint> 
      <endpoint address="net.tcp://serverName:9990/TestService1/" binding="netTcpBinding" 
       bindingConfiguration="NetTcpBinding_IService1" contract="ServiceReference1.IService1" 
       name="NetTcpBinding_IService1"> 
       <identity> 
        <userPrincipalName value="MyUserPrincipalName " /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 
+0

Oui, probablement pas - le message d'erreur offre également deux autres possibles casuse: » ....., un arrêt de la session prématurée ou Erreur Interne du Serveur." –

33

Autres causes possibles:

  • de sérialisation d'un obj ect sans constructeur par défaut.
  • Essayer de sérialiser un autre type d'objet non sérialisable (tel qu'une exception). Pour empêcher la sérialisation de l'élément, appliquez l'attribut [IgnoreDataMember] au champ ou à la propriété.
  • Vérifiez vos champs enum pour vous assurer qu'ils sont définis sur une valeur valide (ou sont nullable). Vous devrez peut-être ajouter une valeur 0 à l'énumération dans certains cas. (pas sûr de détails sur ce point).

Qu'est-ce que le test:

  • Configure WCF tracing pour les erreurs au moins critiques ou des exceptions. Veillez à regarder la taille du fichier si vous activez d'autres traces. Cela donnera des informations très utiles dans de nombreux cas.

    Ajoutez simplement ceci sous <configuration> dans votre web.configSUR LE SERVEUR. Créez le répertoire log s'il n'existe pas.

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Error, Critical" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "c:\log\WCF_Errors.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 
  • Assurez-vous que le fichier .svc va effectivement trouver dans un navigateur sans erreur. Cela vous donnera une aide "première chance". Par exemple, si vous avez un objet non sérialisable, vous aurez ce message ci-dessous. Notez qu'il vous indique clairement ce qui ne peut pas être sérialisé. Assurez-vous que le point de terminaison 'mex' est activé et affichez le fichier .svc dans votre navigateur.

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: System.InvalidOperationException: An exception was thrown in a call to a WSDL export extension: System.ServiceModel.Description.DataContractSerializerOperationBehavior contract: http://tempuri.org/:IOrderPipelineService ----> System.Runtime.Serialization.InvalidDataContractException: Type 'RR.MVCServices.PipelineStepResponse' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.

+2

+1 Merci - J'ai été touché par cette erreur, j'ai trouvé votre réponse, et il s'est avéré que le problème était dû à une énumération de bitmask: lorsque vous avez plus d'un bit défini (et donc aucune valeur enum correspondant) la sérialisation échoue! –

+0

J'ai eu un problème similaire. Le service est bien. Un client travaille; mais le deuxième client ne fonctionne pas: http://stackoverflow.com/questions/12420314/one-wcf-service-two-clients-one-client-does-not-work – Lijo

8

Pour moi, ce message d'erreur a été lancée parce que mon service de web.config comportement par défaut a une faible limite de message, donc quand la WCF est revenu dire 200000 octets et ma limite était 64000 octets la réponse a été tronqué et ainsi vous obtenez le "... réponse non significative". C'est significatif, il vient d'être tronqué et ne peut pas être analysé.

Je vais coller mon changement web.config résolu le problème:

<system.serviceModel> 
<behaviors> 
<serviceBehaviors> 
<behavior name="YourNameSpace.DataServiceBehavior"> 
<serviceMetadata httpGetEnabled="true"/> 
<serviceDebug includeExceptionDetailInFaults="false"/> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
     <serviceTimeouts transactionTimeout="05:05:00" /> 
     <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" 
     maxConcurrentInstances="2147483647" /> 
</behavior> 
</serviceBehaviors> 
</behaviors> 

La valeur MaxItemsInObjectGraph est le plus important!
J'espère que cela aide tout le monde.

+0

J'ai eu un problème similaire. Le service est bien. Un client travaille; mais le deuxième client ne fonctionne pas: http://stackoverflow.com/questions/12420314/one-wcf-service-two-clients-one-client-does-not-work – Lijo

0

Si vous avez deux méthodes avec le même nom et les paramètres dans votre WCF Il lancera cette erreur

2

J'avais un problème similaire. Après avoir réfléchi pendant 2 heures et essayé de trouver une réponse en ligne, j'ai décidé de suivre l'approche pour sérialiser et désérialiser la valeur de retour/objet du côté serveur en utilisant le System.Runtime.Serialization.DataContractSerializer et finalement trouvé que avait manqué d'ajouter l'attribut EnumMember sur l'un des Enums.

Vous rencontrez peut-être un problème similaire.

Voici l'extrait de code qui m'a aidé à résoudre le problème:

 var dataContractSerializer = new System.Runtime.Serialization.DataContractSerializer(typeof(MyObject)); 
     byte[] serializedBytes; 
     using (System.IO.MemoryStream mem1 = new System.IO.MemoryStream()) 
     { 
      dataContractSerializer.WriteObject(mem1, results); 
      serializedBytes = mem1.ToArray(); 
     } 

     MyObject deserializedResult; 
     using (System.IO.MemoryStream mem2 = new System.IO.MemoryStream(serializedBytes)) 
     { 
      deserializedResult = (MyObject)dataContractSerializer.ReadObject(mem2); 
     } 
+0

C'était l'option la plus rapide pour le débogage local, merci ! –

Questions connexes