servicios interfaz ejecutar contrato c# .net asp.net wcf

c# - interfaz - Problema de desajuste de contrato WCF



servicios wcf c# (5)

Tengo una aplicación de consola de cliente que habla con un servicio de WCF y recibo el siguiente error: "El servidor no proporcionó una respuesta significativa; esto podría deberse a una discrepancia en el contrato, un cierre de sesión prematuro o un error interno del servidor".

Creo que es debido a una discrepancia en el contrato, pero no puedo entender por qué. El servicio funciona bien solo y las 2 partes trabajaron juntas hasta que agregué el código de suplantación.

¿Alguien puede ver lo que está mal?

Aquí está el cliente, todo hecho en código:

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

Y aquí está el archivo de configuración del servicio 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>


Estaba teniendo un problema similar. Después de dedicar dos horas la mente a esto e intentar encontrar una respuesta en línea, decidí seguir el enfoque para seralizar y deserializar el valor / objeto de retorno en el lado del servidor usando System.Runtime.Serialization.DataContractSerializer y finalmente encontré que había fallado en agregar el atributo EnumMember en uno de los Enums.

Usted puede estar enfrentando un problema similar.

Aquí está el fragmento de código que me ayudó a resolver el 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); }


Ok, acabo de cambiar el cliente, así que usa un archivo de configuración en lugar de un código y recibo el mismo error.

Código:

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

Aquí está el archivo de configuración del cliente, recién generado desde el Servicio ... lo que me hace pensar que podría no ser un error de incompatibilidad de contrato

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


Para mí, este mensaje de error se emitió porque mi comportamiento del Servicio web.config tiene un límite de mensaje bajo, por lo que cuando WCF devolvió 200000 bytes y mi límite fue de 64000 bytes, la respuesta se truncó y, por lo tanto, aparece el mensaje ".. . Respuesta no significativa ". Es significativo, solo se ha truncado y no se puede analizar.

Pegaré mi web.config cambio que solucionó el 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>

¡El valor maxItemsInObjectGraph es el más importante!
Espero que esto ayude a cualquiera.


Si tiene dos métodos con el mismo nombre y parámetros en su WCF, lanzará este error


Otras posibles causas:

  • Intentando serializar un objeto sin un constructor predeterminado.
  • Intentar serializar otro tipo de objeto no serializable (como una excepción). Para evitar que el elemento se [IgnoreDataMember] atributo [IgnoreDataMember] al campo o propiedad.
  • Compruebe sus campos de enumeración para asegurarse de que estén configurados en un valor válido (o que puedan ser nulos). Es posible que deba agregar un valor de 0 a la enumeración en algunos casos. (No estoy seguro acerca de los detalles finos de este punto).

Qué probar:

  • Configure el seguimiento de WCF para al menos errores críticos o excepciones. Tenga cuidado de ver el tamaño del archivo si habilita cualquier rastro adicional. Esto dará información muy útil en muchos casos.

    Solo agregue esto en <configuration> en su web.config . <configuration> EN EL SERVIDOR Cree el directorio de log si no existe.

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

  • Asegúrese de que el archivo .svc aparezca en un navegador sin errores. Esto te dará alguna ayuda de primera oportunidad. Por ejemplo, si tiene un objeto no serializable, recibirá este mensaje a continuación. Tenga en cuenta que claramente le dice lo que no puede ser serializado. Asegúrese de tener el punto final ''mex'' habilitado y abra el archivo .svc en su navegador.

Un ExceptionDetail, probablemente creado por IncludeExceptionDetailInFaults = true, cuyo valor es: System.InvalidOperationException: se produjo una excepción en una llamada a una extensión de exportación WSDL: System.ServiceModel.Description.DataContractSerializerOperationBehavior contract: http://tempuri.org/:IOrderPipelineService ----> System.Runtime.Serialization.InvalidDataContractException: El tipo ''RR.MVCServices.PipelineStepResponse'' no puede ser serializado. Considere marcarlo con el atributo DataContractAttribute y marcar todos los miembros que desea serializar con el atributo DataMemberAttribute.