Tenemos un servicio WCF que ejecuta ciertos procedimientos almacenados y devuelve los resultados al cliente silverlight. Algunos de los procedimientos almacenados retornan hasta 80K filas.Tamaño del búfer en el servicio WCF
A continuación se presentan los ajustes en web.config de servicio
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<behaviors>
<serviceBehaviors>
<behavior name="MyService.MyServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_MyService"
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
receiveTimeout="00:40:00" openTimeout="00:40:00"
closeTimeout="00:40:00" sendTimeout="00:40:00">
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
<security mode="None"/>
</binding>
</basicHttpBinding>
<customBinding>
<binding name="MyService.MyService.customBinding0">
<binaryMessageEncoding/>
<httpTransport/>
</binding>
</customBinding>
</bindings>
<services>
<service behaviorConfiguration="MyService.MyServiceBehavior"
name="MyService.MyService">
<endpoint name="BasicHttpBinding_MyService"
address=""
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_MyService"
contract="MyService.IMyService"/>
</service>
</services>
</system.serviceModel>
Y esto por cliente
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<behaviors>
<serviceBehaviors>
<behavior name="MyService_Behavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="r1">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_MyService"
closeTimeout="00:03:00" openTimeout="00:03:00"
receiveTimeout="00:10:00" sendTimeout="00:03:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8"
transferMode="Buffered" useDefaultWebProxy="true">
<security mode="None"/>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint name="BasicHttpBinding_MyService"
address="http://localhost:8080/MyService/MyService.svc"
behaviorConfiguration="r1"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_MyService"
contract="MyService.IMyService" />
</client>
</system.serviceModel>
Siempre que el número de registros van más allá de 20K, el servicio genera un error, ya sea como tiempo de espera o NotFound. ¿Por qué crees que sucede esto? ¿Cómo lo soluciono?
¿Seguro que desea devolver 80K filas de una llamada? Tal vez la refacturación y el uso de resultados "paginados" serían más apropiados. – Jon
Sé que suena absurdo, pero mis usuarios están empeñados en que se muestre en la grilla (por supuesto, los mostramos con paginación). La mayoría de las cuadrículas de terceros como Telerik lo admiten aunque – Kev
Puede tratar de obtener esa información en llamadas múltiples DownloadPage (1) ... n obtendrá todos los datos pero en trozos más pequeños – kalvis