14

Tengo un servicio WCF que me ha estado dando este error en condiciones de carga (y en caso contrario no puedo recrear el error). Hemos estado tratando de encontrar una manera alrededor de ella durante una semana ahora con esa suerte ..System.Net.WebException: la solicitud se anuló: la solicitud se canceló

El error que ver tiene dos partes a la misma,

System.ServiceModel.CommunicationException: An error: (The request was aborted: the request was cancelled.) occurred while transmitting data over the http channel.

y:

System.Net.WebException: The request was aborted: the request was cancelled.

He visto a mucha gente sugerir desactivar el trabajo con mantener vivo al sobrecargar un método en el archivo Reference.cs y establecer KeepAlive = false, sin embargo, nuestro lado del cliente está utilizando una referencia de servicio (además de la referencia web) y esta opción no existe nunca más.

Otra opción que he visto fue agregar un Enlace personalizado al servicio en lugar del BasicHttpBinding que estamos usando ahora, pero eso molestaría el soporte retroactivo del servicio web para aquellos que han estado usando una referencia web (ya que CustomBinding no es SOAP habilitado).

¿Alguien ha tratado este error antes? ¿Hay alguna manera de desactivar la función de mantener activo en WCF sin afectar el lado del servidor? ¿Hay algo más que mantener vivo que se sabe que causa este error?

+0

Puede acceder a Http Context y hacer lo que quiera. Eche un vistazo aquí: http://blogs.msdn.com/b/justinjsmith/archive/2007/08/22/setting-http-headers-in-wcf-net-3-5.aspx – Aliostad

Respuesta

5

No creo que HTTP Keep alive sea responsable de esto. WCF debería ser capaz de manejar esto por sí mismo, de modo que la conexión persistente HTTP se comparta entre las solicitudes y si caduca (expira después de 100s of inactivity) WCF crea una nueva sin activar ninguna excepción. Si su conexión se interrumpe durante la transmisión de solicitud, entonces espero que haya algún otro problema.

Puede utilizar esta unión personalizado como equivalente a BasicHttpBinding sin HTTP mantener viva:

<bindings> 
    <customBinding> 
    <binding name="NoKeepAlive"> 
     <textMessageEncoding messageVersion="Soap11" /> 
     <httpTransport keepAliveEnabled="false" /> 
    </binding> 
    </customBinding> 
</bindings> 
+2

Sí, es responsable y lo he visto antes – Aliostad

+0

Wow, acabo de experimentar esto yo mismo. Qué sorpresa. Gracias, @Aliostad – Alexandru

+0

@Aliostad Solo por curiosidad, ¿también está llamando a un servicio web Java basado en Tomcat? – Alexandru

1

tenía este mismo problema. En mi caso, estaba ejecutando solicitudes de forma asincrónica. Estaba enviando unos cientos de solicitudes al "servidor" de mi cliente. Estoy/estaba usando basicHttpBinding. Y en mi configuración de app.config, la propiedad openTimeout se estableció en 60 segundos o un minuto. Una vez que establecí eso en un número mayor como 10 minutos, el problema desapareció.

Así, por ejemplo, me cambiaron todos estos valores en mi archivo app.config:

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_IScriptRunHost" closeTimeout="00:10:00" 
        openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 

a 10 minutos.

4

Tuve este problema al intentar cargar archivos de gran tamaño. Tuve que agregar esto al web.config de los servicios web

<system.web> 
    <httpRuntime maxRequestLength="10240" /> 
Cuestiones relacionadas