2009-08-12 20 views
17

Ho un'app console client che comunica con un servizio WCF e viene visualizzato il seguente errore: "Il server non ha fornito una risposta significativa, ciò potrebbe essere causato da una mancata corrispondenza del contratto, una chiusura prematura della sessione o un errore interno del server. "Problema di disallineamento contratto WCF

Penso che sia a causa di un disallineamento del contratto ma non riesco a capire perché. Il servizio funziona bene da solo e le 2 parti hanno funzionato insieme fino a quando ho aggiunto il codice di rappresentazione.

Qualcuno può vedere cosa c'è che non va?

Ecco il cliente, il tutto fatto in codice:

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(); 

e qui è il file di configurazione del servizio 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> 

risposta

1

Ok, ho appena cambiato il client in modo che usa un file di configurazione invece di codice e ottengo lo stesso errore!

Codice:

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

Ecco il file di configurazione del client, appena generato dal servizio ... che rende la mia pensare che potrebbe non essere un errore di mancata corrispondenza contratto

<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

Sì, probabilmente non - il messaggio di errore offre inoltre più di due casuse possibile:" ....., un arresto prematuro della sessione o un Errore interno del server." –

33

Altre cause possibili:

  • Cercando di serializzare un obj ect senza un costruttore predefinito.
  • Provare a serializzare qualche altro tipo di oggetto non serializzabile (come un'eccezione). Per impedire che l'articolo venga serializzato, applicare l'attributo [IgnoreDataMember] al campo o alla proprietà.
  • Controllare i campi enum per assicurarsi che siano impostati su un valore valido (o che siano annullabili). Potrebbe essere necessario aggiungere un valore 0 all'enumerazione in alcuni casi. (non sono sicuro dei dettagli di questo punto).

Cosa prova:

  • Configure WCF tracing per errori almeno critici o eccezioni. Prestare attenzione a guardare i file se si abilitano ulteriori tracce. Ciò fornirà alcune informazioni molto utili in molti casi.

    Basta aggiungere questo sotto <configuration> nel tuo web.configSUL SERVER. Creare la directory log se non esiste.

<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> 
  • assicurarsi che il file .svc sarà effettivamente messo a punto in un browser senza errori. Questo ti darà un po 'di aiuto' prima possibilità '. Ad esempio se hai un oggetto non serializzabile riceverai questo messaggio qui sotto. Nota che ti dice chiaramente cosa non può essere serializzato. Assicurati di avere l'endpoint 'mex' abilitato e apri il file .svc nel tuo browser.

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 Grazie - Sono stato colpito da questo errore, ho trovato la tua risposta, e si è scoperto che il problema era causato da una enumerazione di maschera di bit: quando hai più di un bit impostato (e quindi nessun valore enum corrispondente) la serializzazione non riesce! –

+0

Ho avuto un problema simile. Il servizio è buono. Un cliente sta lavorando; ma il secondo client non funziona: http://stackoverflow.com/questions/12420314/one-wcf-service-two-clients-one-client-does-not-work – Lijo

8

Per me, questo messaggio di errore è stato gettato, perché il mio comportamento l'web.config servizio di default ha un limite inferiore del messaggio, in modo che quando il WCF ha restituito dire 200000 byte e il mio limite era 64.000 byte la risposta è stata troncato e quindi ottieni la "risposta non significativa". È significativo, è stato solo troncato e non può essere analizzato.

Io incollo il mio web.config modifiche che hanno corretto il problema:

<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> 

Il valore maxItemsInObjectGraph è il più importante!
Spero che questo aiuti chiunque.

+0

Ho avuto un problema simile. Il servizio è buono. Un cliente sta lavorando; ma il secondo client non funziona: http://stackoverflow.com/questions/12420314/one-wcf-service-two-clients-one-client-does-not-work – Lijo

0

Se si dispone di due metodi con lo stesso nome e parametri nel vostro WCF getterà questo errore

2

ho avuto un problema simile. Dopo aver speso una mente piegando 2 ore su questo e cercando di trovare una risposta online, ho deciso di seguire l'approccio per serializzare e deserializzare il valore restituito/oggetto sul lato server utilizzando System.Runtime.Serialization.DataContractSerializer e infine ho scoperto che io mancava aggiungere l'attributo EnumMember a uno degli Enum.

Potrebbe essersi verificato un problema simile.

Ecco il frammento di codice che mi ha aiutato a risolvere il problema:

 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

Questa è stata l'opzione più rapida per il debugging locale, grazie ! –

Problemi correlati