c# - studio - thread abort
Response.Redirect resultados en "Objeto movido a aquĆ" (8)
Estoy trabajando en una página C # ASP.NET que normalmente termina redirigiendo a una URL de "archivo:". Esto parece funcionar bien la mayoría de las veces, en la mayoría de las circunstancias, pero ocasionalmente (y, en mi sistema de prueba, aparentemente siempre) en lugar de redirigir a un archivo, obtengo una página con el texto "Objeto movido aquí" , donde "aquí" es un enlace al archivo que estaba tratando de redireccionar, pero con cuatro barras después de dos puntos en lugar de dos (es decir, "file: ////testserver/docs/testdoc.doc")
Normalmente, esto va acompañado de un mensaje "System.Threading.ThreadAbortException: Thread was being aborted".
He buscado una solución en otro lugar y descubrí algunas cosas interesantes sobre Response.Redirect que causan excepciones de ThreadAbort, pero ese no parece ser el problema fundamental: me parece que el problema real es el "Objeto movido hasta aquí" mensaje, que hace que la excepción sea lanzada.
¿Alguien tiene alguna sugerencia de por qué estoy recibiendo eso ...?
EDITAR: Olvidé mencionar que estoy ejecutando Firefox (3.5.7) con IE Tab, así que estaba a punto de mencionar que cuando pensé que sería mejor probarlo en IE, y listo - funciona en IE (7).
Acabo de encontrar un caso donde esto está sucediendo. Resulta que teníamos algún código que efectivamente hizo:
if (condition)
{
Response.Redirect(page1);
}
Response.Redirect(page2);
Obviamente, la persona que escribió esto (afortunadamente hace un buen rato) no se dio cuenta de que un Response.Redirect no termina, por defecto, el hilo.
No tengo idea de cuáles son las consecuencias de hacer esto, sino un rastro de este aspecto que muestra una redirección corrupta. Esto podría ser una coincidencia, por supuesto, pero este es el único lugar donde hemos visto este problema.
En MVC, puede ver esto después de un RedirectToRoute () .
Si usa una herramienta como Fiddler , debería ver un problema con la respuesta del servidor. Noté un Error 500 .
En mi caso, esto fue causado por un objeto que se agrega a la sesión que NO fue serializable .
Esto hizo el truco para mí cuando vi este problema:
[Route("/something/{param}", "GET")]
public class MyRequestArg{
public string param{get;set;}
}
public class MyRequestService
{
public object Get(MyRequestArg request)
{
var url = "http://www.zombo.com";
var myCookieString = "anything is possible!";
var result = new HttpResult
{
StatusCode = HttpStatusCode.Redirect,
Headers = {
{HttpHeaders.Location, url},
{HttpHeaders.SetCookie, myCookieString}
}
};
return result;
}
}
Esto puede ser causado al poner el método Response.Redirect()
en el bloque try-catch
. La solución con la que me encontré fue finalizar la respuesta virtualmente al enjuagar un encabezado de redirección al cliente. echar un vistazo:
HttpResponse Response = HttpContext.Current.Response;
Response.StatusCode = 301;
Response.StatusDescription = "Moved Permanently";
Response.RedirectLocation = "YourRedirectionUrlHere.aspx";
Response.Flush();
Otra razón por la que esto podría suceder es que está redireccionando de una página https a una página http. Al cambiar la URL de redireccionamiento para que también sea https: // se solucionó el problema.
Solo para referencia futura, otra razón por la que esto puede ocurrir es si hace algo como Response.Redirect (null) o similar. Tuve una situación en la que mi variable que contenía la URL era nula y esto es lo que obtuve.
Solucioné este problema estableciendo mi variable de cadena global en estática, porque mi URL se restablecía a vacía cuando redireccionaba.
Usar elemento de anclaje con runat=server
<a runat="server" ID="anchor1">anything can be here</a>
En código detrás:
if (!ispostback)
anchor1.href="whateveryoulink";
Darle una oportunidad.
Está funcionando mejor que el Status Code=301
anterior Status Code=301
método.