He creado un servicio web en WCF que devuelve más de 54000 filas de datos con 10 datos en cada fila. He usado el wsHttpBinding para la comunicación. El servicio funciona bien con menos datos (es decir, 2000 filas) pero se dispara cuando se intenta enviar un gran conjunto de registros con más de 500 filas (~ 2MB). El mensaje de excepción es asíTransferir gran cantidad de datos en el servicio WCF
Ocurrió un error al recibir la respuesta HTTP a
http://localhost:9002/MyService.svc
. Esto podría deberse a que el enlace del punto final del servicio no utiliza el protocolo HTTP. Esto también podría deberse a que el servidor ha cancelado un contexto de solicitud HTTP (posiblemente debido a que el servicio se ha apagado). Vea los registros del servidor para más detalles.
Por favor, no me diga que use la paginación en el lado del cliente - Sé que va a resolver el problema. Pero necesito todo el fragmento de datos en el cliente final.
Mi configuración de servicio en el servidor es tan
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="MyWsHttpBinding" />
</wsHttpBinding>
</bindings>
<services>
<service name="AdminService">
<endpoint address="AdminSrv"
binding="wsHttpBinding"
contract="IAdminService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="/Bus/IRfotoWCF" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"></serviceHostingEnvironment>
</system.serviceModel>
Mi configuración del cliente es tan
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IAdminService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/TestService/AdminService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAdminService"
contract="IAdminService" name="BasicHttpBinding_IAdminService" />
</client>
</system.serviceModel>
¿Alguien que me ayude con la configuración de excact tanto en el lado del cliente y el servidor. Incluso si necesito cambiar el enlace de wsHttpBinding a netTcpBinding - no tengo ningún problema para hacerlo. Gracias por adelantado.
No entiendo. ¿Es realmente una buena solución cuando un servicio espera otro servicio durante 5,20 minutos? Creo que esta es la gran pregunta sobre la arquitectura, pero no puedo encontrar una solución. – Vladislav
Continúo probando la velocidad con transferencia de datos grandes. Utilizando el método "Chunks" puedo enviar 300 000 (!) Filas, guardarlo en la base de datos dentro de 4.34min sin ningún cambio en las configuraciones de mi servicio. Solo estoy separando mis datos en trozos con 50 filas. – Vladislav
Debe usar el serializador Datacontract en lugar del XML. Este es hasta ahora un trabajo de reemplazo manual dentro de los reference.cs. – NickD