2009-08-25 45 views
8

Llamo a un servicio web WCF localmente (o de forma remota) que funciona bien con pequeñas cantidades de datos (unas 25 líneas de < 1K de datos ea). Pero cuando los datos se vuelven más grandes (alrededor de 300 líneas) el servicio web falla. A continuación se muestra la excepción, excepción interna y Stack Trace de la excepción interna.El servicio web WCF falla al recibir datos grandes

El servicio también parece tardar inusualmente largo en ejecutarse localmente (lo agrego porque puede darle alguna pista para resolverlo). Obtener la gran cantidad de datos toma 3s del lado del servidor y el pequeño de los datos toma 1s del lado del servidor. Sin embargo, ejecutar el servicio web (localmente) para recuperar la pequeña cantidad de datos toma 24 segundos.

También tengo incluida la información de enlace de la aplicación.config de la aplicación de prueba de mi cliente.

========= información vinculante ===========

<system.serviceModel> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="BasicHttpBinding_IFormsService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="02:00:00" sendTimeout="00:02:00" 
      allowCookies="false" bypassProxyOnLocal="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="1000000000" 
         maxArrayLength="1000000000" 
         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://monica-pc/TrialIQSvc/FormsService.svc/FormsService/FormsService.Svc" 
     binding="basicHttpBinding" 
     bindingConfiguration="BasicHttpBinding_IFormsService" 
     contract="WebService.IFormsService" name="BasicHttpBinding_IFormsService" /> 
</client> 

EXCEPCIÓN ========= =============

**Exception**: An error occurred while receiving the HTTP response to http://monica-pc/TrialIQSvc/FormsService.svc/FormsService/FormsService.Svc. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details. 

**Inner Exception**: The underlying connection was closed: An unexpected error occurred on a receive. 
    **Stack trace**: 
Server stack trace: 
    at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at Test.WebService.IFormsService.GetFormGroupInstance(String formGroupId, String subjectId, String userId) 
    at Test.WebService.FormsServiceClient.GetFormGroupInstance(String formGroupId, String subjectId, String userId) in G:\SVNTrialIQ\trunk\Common\trunk\source\Forms\Test\Service References\WebService\Reference.cs:line 59 
    at Test.Form1.btnInstanceInfo_Click(Object sender, EventArgs e) in G:\SVNTrialIQ\trunk\Common\trunk\source\Forms\Test\Form1.cs:line 408 

Respuesta

2

de datos para obtener información extendida de error intente utilizar SvcTraceViewer.

+0

¡Sí! Eso lo hizo. No pude obtener un registro de seguimiento para que aparezca en mi máquina de desarrollo (Vista). Pero, cuando miro la interfaz de IIS 7 provista con Vista, debo admitir que me hace sentir que nunca antes había tocado una computadora en mi vida. Así que no hice demasiada solución de problemas. –

+0

Sin embargo, al ejecutar el código de seguimiento en web.config en mi servidor Win2003, se reveló que se trataba de un error de tipo debido a la herencia, que no está relacionado, pero que se describe muy bien aquí: http://developers.de/blogs/damir_dobric/archive /2009/03/24/about-quot-knowntypeattribute-quot-example.aspx –

0

Podría ser que se echa en falta alguna configuración en el servidor

2

Hay una serie de cosas que podrían salir mal.

Antes que nada, como ya se sugirió "darin", intente encender el rastreo de mensajes y vea qué produce eso.

Segundo: puede que se esté acabando el tiempo de espera. Dijiste que tu pequeño conjunto de datos tomó alrededor de 24 segundos para volver, tu conjunto de datos más grande es 12 veces más grande (300 contra 25 líneas), por lo que podría tomar 288 segundos, pero tu sendTimeout está configurado en 2 minutos, por lo que podría ser la razón. Intente aumentar que el establecimiento de digamos 10 minutos - que debería ser tiempo suficiente:

<binding name="BasicHttpBinding_IFormsService" 
      sendTimeout="00:10:00" 

Si esto no soluciona - usted podría tratar de usar el streaming con el fin de mover hacia atrás las grandes cantidades de datos:

<binding name="BasicHttpBinding_IFormsService" 
     transferMode="StreamedResponse"> 

Siempre y cuando solo sean sus respuestas grandes, eso debería funcionar. Por supuesto, tendría que volver a diseñar su cliente llamando un poco al servicio para manejar la transmisión (crear un contrato de operación = método de servicio que devuelva Stream como su valor de retorno, y usar la transmisión para leer los datos en fragmentos del servidor) . Si ese es un escenario común para usted, podría funcionar y valdría la pena el esfuerzo (y le permitiría reducir el tamaño de su búfer de nuevo, para evitar un ataque de denegación de servicio al ser inundado con mensajes enormes).

Ver un gran intro to WCF message streaming para obtener más información sobre la transmisión.

¡Y si nada ayuda, vuelve y avísanos!

Marc

+0

Miro el artículo de transmisión. Gran referencia! La puesta a punto del rendimiento es mi próximo paso. –

0

Prueba esto: en el en la sección system.web. Establezca el atributo maxRequestLength.

<httpRuntime executionTimeout="90" maxRequestLength="1048576" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100"/> 
0

Este error puede deberse a una falta de coincidencia de contrato. Considere los tres aplicación en capas por debajo ...

UI Layer        
    |  
Process Layer 
    | 
Data Access Layer     
-> Contract Between Process and UI layer has the same enum with missing (Onhold = 3). Enum: Start = 1, Stop = 2. 
-> Contract Between Data Access And Process layer has enum Enum: Start = 1,Stop = 2,Onhold = 3. 

En este caso vamos a conseguir el mismo error en respuesta capa de procesos.

El mismo error viene en otro contrato no coincidente en la aplicación de varias capas.

Cuestiones relacionadas