2009-05-23 17 views
29

Obtengo la siguiente excepción de forma intermitente en mi servicio .Net WCF. "El servicio HTTP ubicado en http://MyServer/TestWCF/MyService.svc está demasiado ocupado."Error de servicio demasiado ocupado en WCF

¿Falta algo aquí?

Estoy usando el enlace http básico y he habilitado el límite WCF.

<basicHttpBinding> 
     <binding name="BasicHttpBinding_MyService" maxReceivedMessageSize="2147483647" 
       messageEncoding="Text" textEncoding="utf-16" sendTimeout="00:01:00" > 
      <readerQuotas maxStringContentLength="2147483647" maxArrayLength="163840000" 
         maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" /> 
     </binding> 

. . . .

<behavior name="MyWCFServices.MyServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceThrottling 
        maxConcurrentCalls="16" 
        maxConcurrentInstances="2147483647" 
        maxConcurrentSessions="10"/> 
     </behavior> 

¿Puede el estrangulamiento ayudar a resolver el problema? Además, ¿puedo saber los valores de parámetros recomendados para la regulación de un sitio web de alto tráfico?

Respuesta

10

Definitivamente podría intentar aumentar el maxConcurrentSessions y maxConcurrentCalls en su comportamiento de regulación de servicio a los valores estándar de 30 o más y ver si eso hace que el error desaparezca. El servidor demasiado ocupado parece indicar que han ingresado más solicitudes que el área permitida por el comportamiento de aceleración del servicio, y se han descartado porque no se dispuso de ninguna instancia de servicio para darles servicio dentro del período de tiempo de espera dado.

+0

gracias por su respuesta ... ¿necesito habilitar la aceleración tanto en el lado del servidor como en el servidor web.configs? –

+0

también, me gustaría saber cuál es el valor recomendado para el parámetro maxConcurrentInstances? –

+0

Hola Steve: no hay necesidad de manejar esto en el cliente; esta es una configuración solo del lado del servidor. En cuanto a maxConcurrentInstances: pregúntese cuántas solicitudes de clientes desea manejar simultáneamente. 5? 10? ¿Cuánto tiempo lleva manejar la solicitud? Un buen punto de partida podría ser 30 y ver si a) esto ayuda a su servicio a ser más receptivo, yb) no sobrecarga su servidor. Ajusta según sea necesario después de ver cómo se comporta. –

2

No es solo el maxConcurrentSessions, sino también cuánto tiempo dura la sesión.

Si el cliente no cierra la conexión, permanecerá abierta hasta que se agote el tiempo de espera. Luego, puede alcanzar el límite de maxConcurrentSessions con muy poca actividad en el servidor.

+2

En realidad, el cliente no debe usar la instrucción using. La limpieza debe manejarse de forma explícita. Consulte http://msdn.microsoft.com/en-us/library/aa355056.aspx para obtener más detalles. –

+0

@Anthony, gracias por el comentario, he eliminado la parte que usa. Esto fue a partir de 2009, cuando era más joven y no sabía nada mejor :) –

+1

@AntSwift: Mucha gente lo sabe, pero no lo hagas. – abatishchev

1

La única fuente de esta excepción que conozco es si está utilizando sesiones, y logra presionar el acelerador MaxPendingChannels. Su valor predeterminado es algo muy bajo como 4. Podría intentar configurarlo más alto (128 por ejemplo), o si solo quiere repro, establézcalo en 1 y debería verlo bajo la prueba de carga.

Consulte aquí para obtener más información sobre las sesiones: http://msdn.microsoft.com/en-us/library/ms733795.aspx

9

Mi respuesta sería, comprobar si el grupo de aplicación está en marcha y así?

He visto este error que se produce cuando el grupo de aplicaciones ha muerto debido a excepciones que no se detectan.

Considere, por ejemplo, secciones de configuración personalizadas: si hay un error allí, la aplicación fallará incluso antes de que se inicie. Demasiados de estos en un corto espacio de tiempo matarán al grupo de aplicaciones.

+0

Compruebe esto primero. Puede "verse" bien, pero si detiene el grupo de aplicaciones desde el administrador, no podrá volver a iniciarlo. Para que todo vuelva a funcionar, use "net stop w3svc" y luego "net start w3svc" desde la línea de comandos. – tofutim

+0

Gracias por salvar mi cordura que estaba a punto de salir por la puerta. – eouw0o83hf

+0

Esto lo hizo por mí chicos! Recycled the app pools and bingo – JeremyS

4

Si su servicio se ejecuta con su cuenta (Identidad), es posible que haya cambiado su contraseña recientemente; deberá restablecerla para su grupo de aplicaciones IIS en Configuración avanzada | Cuadro de diálogo de identidad.

+1

+1 Esto acaba de pasar en un entorno de producción. Mensaje de error muy engañoso que indica que el servidor está ocupado. Abucheo. ¡Gracias por señalar esto! –

1

Acabo de tropezar con este error, y se redujo a un problema de configuración simple. Tenía un servicio en el mismo puerto y la misma interfaz (servicio simulado). Ejecuté el servicio con el interruptor de línea de comando apropiado para ejecutar el servicio "original" que pretendía. El error desapareció

0

Mi solución sería, compruebe el archivo App.Config, si la etiqueta de servicio está allí para este servicio en particular.

por ejemplo:

<service name="MyServices.ServiceName"> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="TestBinding" contract="MyServices.ServiceName"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyServices/ServiceName/" /> 
      </baseAddresses> 
     </host> 
</service> 
2

Asegúrese de revisar la excepción interna, también; durante nuestros despliegues, desactivamos el grupo de aplicaciones de un servicio web WCF, y los clientes comienza a recibir este error durante ese tiempo:

System.ServiceModel.ServerTooBusyException: The HTTP service located at https://ourserver.x.com/path/service.svc is too busy. ---> System.Net.WebException: The remote server returned an error: (503) Server Unavailable.

Así que en este caso es un error HTTP 503 (¿mal) interpretan como "servidor demasiado ocupado".

Cuestiones relacionadas