Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

449
Views
El grupo de aplicaciones de IIS se bloquea unos 20 segundos después de que el middleware registra una OperationCancelledException

En nuestro servidor de producción, de manera intermitente a lo largo del día, vemos que esto se registra:

Un grupo de aplicaciones de servicio de procesos 'MyApi' sufrió un error fatal de comunicación con el Servicio de activación de procesos de Windows. La identificación del proceso era '29568'. El campo de datos contiene un error numérico.

He visto sugerencias para solucionar esto, como configurar algo de 32 bits en IIS, pero no tengo control sobre IIS a nivel de producción. Además, mi empresa ejecuta docenas de grupos de aplicaciones y solo el que estoy investigando tiene este problema. Así que he descartado algún tipo de problema de configuración de IIS.

Ejecuté el volcado de memoria a través de DebugDiag y esto es lo que se informa:

En w3wp.exe.18080.dmp, la instrucción de ensamblaje en iiscore!W3_CONTEXT_BASE::GetIsLastNotification+62 en C:\Windows\System32\inetsrv\iiscore.dll de Microsoft Corporation provocó una excepción de infracción de acceso (0xC0000005) al intentar leer desde ubicación de memoria 0xd7f76008 en el subproceso 94

Intenté buscar en Google GetIsLastNotification y encontré esto en los documentos de MS :

No use PreSendRequestHeaders con módulos administrados que implementen IHttpModule. Establecer estas propiedades puede causar problemas con las solicitudes asincrónicas. La combinación de enrutamiento solicitado por la aplicación (ARR) y websockets puede dar lugar a excepciones de infracción de acceso que pueden hacer que w3wp se bloquee. Por ejemplo, iiscore!W3_CONTEXT_BASE::GetIsLastNotification+68 en iiscore.dll provocó una excepción de infracción de acceso (0xC0000005).

Dice no usar PreSendRequestHeaders con módulos que implementan IHttpModule. He verificado que ningún código hace que toda la aplicación haga esto . También verifiqué que ningún código en todas las bibliotecas de nuestra empresa hace esto.


Aquí hay algo muy interesante e inusual. Aproximadamente 20 segundos antes de que se bloquee el grupo de aplicaciones, veo que se registra esto: System.OperationCanceledException: The operation was canceled.

He determinado que este error proviene de algún middleware de Owin. En el archivo Startup.cs de la aplicación, registramos una clase que realiza algunos registros. Registra esta OperationCanceledException debido a este código:

 // This class inherits from OwinMiddleware public override async Task Invoke(IOwinContext context) { try { await this.Next.Invoke(context); } catch (Exception ex) { // log stuff } }

Todo lo que sucede aquí es que cuando se cancela una solicitud http, await.this.Next.Invoke(context) arroja la excepción porque eso es lo que se supone que debe hacer. Esto no parece un gran problema, pero la pregunta se reduce a esto: ¿Cómo es que una solicitud cancelada conduce a un bloqueo del grupo de aplicaciones ~ 20 segundos después?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Después de un tremendo esfuerzo, se encontró la respuesta a esto. Los "20 segundos" a los que se hace referencia en el título terminaron siendo una pista falsa debido a un retraso en el registro. Pero a continuación se muestra la causa de los bloqueos del grupo de aplicaciones.

En el archivo Startup.cs de la aplicación, estábamos registrando algún middleware de Owin. El middleware se veía así:

 public override async Task Invoke(IOwinContext context) { try { await Next.Invoke(context); } catch (Exception ex) { // log the error and return a 500 response await LogAndRespond(context, ex); } }

El problema con esto es que cuando un cliente cancela una solicitud que invoca esta API, Next.Invoke(context) lanza una OperationCanceledException . En el bloque catch, registramos este error pero, lo que es más importante, devolvimos una respuesta a la solicitud cancelada .

No entiendo completamente por qué esto haría que todo el grupo de aplicaciones fallara. Supongo que el intento de Middleware de responder a una conexión cerrada causó la violación de acceso a la memoria. Independientemente, la solución fue NO enviar una respuesta . El código final terminó luciendo así.

 public override async Task Invoke(IOwinContext context) { try { await Next.Invoke(context); } catch (OperationCanceledException) { // Log the canceled request as info, but do NOT send it a response _logger.LogInformation("Request has been canceled: {Url}", context.Request.Uri); } catch (Exception ex) { // log the error and return a 500 response await LogAndRespond(context, ex); } }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!