2012-06-29 15 views
10

Me dijeron que Respond.Redirect es un proceso costoso porque genera una excepción ThreadAbortException. Entonces, en su lugar, deberíamos usar la función CompleteRequest. Así que lo probé, pero noté que los códigos debajo aún se ejecutan, lo que no quiero. Quiero forzar instantáneamente al navegador para saltar a otro sitio web.ApplicationInstance.CompleteRequest no detiene la ejecución del código debajo de él?

Public Shared Sub TestCompleteRequest() 
      If 1 = 1 Then 
       System.Web.HttpContext.Current.Response.Redirect("Http://Google.com", False) 
       System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest() 
      End If 

      Throw New ApplicationException("Hello, why are you here?") 
End Sub 

En cuanto al código anterior, todavía se emite ApplicationException. ¿Pero por qué? :(

Respuesta

15

Un método no reemplaza a la otra directamente. El CompleteRequest() methodno lo hace ejecución final cuando se llama. Así que si eso es realmente lo que quiere hacer a continuación Response.Redirect (cadena) sería el camino a seguir .

CompleteRequest() simplemente no pasa por el método de Response.End(), que es lo que genera el ThreadAbortException usted ha mencionado, pero fundamentalmente CompleteRequest() vacía el búfer de respuesta. Esto significa que la respuesta de redirección HTTP 302 se envía al navegador en la línea de donde llama a CompleteRequest(), que le da la oportunidad de realizar operaciones que no afectan la respuesta después de haber sido enviada al usuario.

La solución para usted realmente depende de lo que necesita lograr, ¿puede proporcionar un ejemplo de para qué está utilizando Response.Redirect y qué otro código tiene el mismo método?

+0

Hola Greg, gracias por tu respuesta. Esto es lo que se supone que debe hacer el código. Si un usuario entra en la página y no está conectado, me gustaría redirigirlo a otra página de inicio de sesión. Por lo tanto, la declaración 'IF' en el código anterior debe ser 'si el usuario no inicia sesión, luego redirija aquí' e ignore todos los códigos debajo de él. – Lasker

+2

En ese caso, tendría que usar 'Response.Redirect (string)' en el bloque if, o regresar desde el Sub justo después de la llamada a 'CompleteRequest()'. Creo que en VB.NET puedes poner 'Return' antes del' End If'. – greg84

+0

Sí, creo que iré con la opción CompleteRequest e intentaré no ejecutar ningún otro código después de ella. ¡Gracias! :) – Lasker

1

Llamar a un método en el marco de las ofertas de ASP.NET con la solicitud , pero el hecho es que eres sigue escribiendo y funcionando VB.NET - no hay nada en el lenguaje (ni debe haber, Yo diría) que indica 'cuando este método regrese, realice un Exit Sub'.

¿Quién quiere decir que no querrá ejecutar un poco más del método después de decirle a ASP.NET que complete la solicitud, de todos modos?

Cuestiones relacionadas