tag route page net asp asp.net multithreading

asp.net - page - asp route tag helper



¿Por qué mi aplicación asp.net está lanzando ThreadAbortException? (5)

pregunta auto explicativa.

¿Por qué esta cosa burbujea en mi intento de captura, incluso cuando no pasa nada?

¿Por qué aparece en mi registro, cientos de veces?

Sé que es una pregunta nueva, pero si este sitio va a obtener una clasificación de búsqueda y dibujar nuevos, tenemos que preguntarles




Como han dicho otros, ocurre cuando se llama a Response.End () (que ocurre cuando se llama a Response.Redirect sin pasar falso como el segundo parámetro). Esto está funcionando según lo diseñado; Por lo general, si llama a Response.Redirect, desea que la redirección se realice de inmediato. Vea esto para más información:

Response.Redirect y ThreadAbortException


La razón por la cual Response.Redirect dará esta excepción es que asp.net implementa internamente esta API con Thread.Abort (). Cuando se llama a este método, se lanza una ThreadAbortException especial. Esta excepción no será tragada por ningún bloque catch. Se volverá a lanzar al final de cada bloque de captura.


Sabiendo que hay (al menos) tres API que usan Thread.Abort , me gustaría responder en términos más prácticos, cómo resolver qué hacer al respecto.

Para nosotros, este error comenzó a registrarse de repente. ¿Qué cambió? Solucionamos un error en algún procedimiento de base de datos que estaba tratando con sitemaps.

Los registros de log4net mostraron que el encabezado X-Forwarded-For (estamos detrás de un NLB) era la dirección IP del robot de Google, 66.249.78.x, lo que reforzó mi teoría sobre el cambio del mapa del sitio que lleva a Google a rastrear nuestro sitio buscando imágenes de manera más agresiva.

Lo primero fue descubrir por qué solo el robot de Google pudo causar este problema. Ningún otro cliente estaba activando la ruta del código que utiliza Response.Redirect , o lo que sea.

Así que en el controlador HttpApplication.Error , agregué un código para registrar resultados detallados adicionales con todos los encabezados, y la mayoría de los datos en HttpResponse y HttpContext arrojaron para iniciar sesión.

Esto me permitió ver que el problema era que Googlebot está usando una cadena de agente de usuario de iPhone y armada con eso, pude buscar en la base de código "iPhone" y proponer:

private void CheckIPhoneAccess() { ... }

Y eso usa un Redirect.

¿Qué hacer al respecto?

Bueno, para esta base de código antigua, no vale la pena retroceder todas las llamadas Response.Redirect , por lo que voy a reducir el nivel de registro para ThreadAbortException para la aplicación.

Cambiaré el comportamiento del rastreador móvil de Googlebot, que no llevaría a "mentiras" sobre lo que nuestro sitio sirve a los móviles, ya que solo redirige en el primer golpe, posteriormente lee una cookie y muestra la imagen. Googlebot no parece almacenar en caché esa cookie.

No es perfecto, pero el sitio debe ser reconstruido. probablemente por otro equipo que use Scala o algo así, así que en términos prácticos, creo que esta es una buena opción. Agregaré comentarios y podría volver a tratar el problema más adelante, crear una extensión Response.SafeRedirect que encapsule este consejo:

¿Por qué Response.Redirect causa System.Threading.ThreadAbortException?

Luke