2010-02-02 21 views
28

Estoy trabajando en una página C# ASP.NET que normalmente termina redirigiendo a un "archivo:" URL. 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 redirigir, pero con cuatro barras en dos en lugar de dos (es decir, "archivo: ////testserver/docs/testdoc.doc")Response.Redirect results in "Objeto trasladado aquí"

Esto normalmente va acompañado de un mensaje "System.Threading.ThreadAbortException: Thread was an aborted".

He buscado una solución en otro lugar y descubrí algunas cosas interesantes acerca de Response.Redirect causando excepciones de ThreadAbort, pero ese no parece ser el problema fundamental, me parece que el problema real es el "Objeto movido a aquí "mensaje, lo que hace que la excepción sea lanzada.

¿Alguien tiene alguna sugerencia de por qué estoy recibiendo eso ...?

EDIT: se olvidó de mencionar que estoy ejecutando Firefox (3.5.7) con IE Tab, por lo que estaba a punto de mencionar que cuando pensé que mejor probarlo en IE, y listo - que funciona en IE (7)

+0

¿Esto sucede en varios navegadores? ¿Ha intentado ejecutar Fiddler para supervisar la solicitud/respuesta, para ver la respuesta HTTP sin procesar? –

+0

¿Qué versión de .NET estás usando? Parece que fue un problema común en los 1.1 días ... –

+0

Aquí hay algunas publicaciones SO relacionadas: [http://stackoverflow.com/questions/922648/response-redirect-not-always-redirecting](http:/ /stackoverflow.com/questions/922648/response-redirect-not-always-redirecting) [http://stackoverflow.com/questions/1497285/how-do-i-redirect-a-browser-to-a-local -file-in-asp-net] (http://stackoverflow.com/questions/1497285/how-do-i-redirect-a-browser-to-a-local-file-in-asp-net) –

Respuesta

13

Esto puede ser causado al poner el método Response.Redirect() en el bloque try-catch. La solución que recibí 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(); 
+0

Esto funciona muy bien para mí (Lo usé para generar y devolver un archivo iFal de protocolo webcal: //) aunque no tuve que configurar la propiedad StatusDescription –

+1

. Esta también es una respuesta para esta pregunta: http://stackoverflow.com/questions/347281/asp-net-custom-404-returning-200-ok-instead-of-404-not-found –

22

Sólo para referencia futura otra razón que esto puede ocurrir es que si haces algo como Response.Redirect (nulo) o similar. Tuve una situación en la que mi variable que contenía la URL era nula y esto es lo que obtuve.

+0

en mi caso publiqué el parámetro null en una 'api REST' y la respuesta fue redirigida a una URL nula en lugar de url generado – stom

5

Acabo de encontrar un caso donde esto está sucediendo. Resulta que teníamos un poco de código que hizo efectiva:

if (condition) 
{ 
    Response.Redirect(page1); 
} 
Response.Redirect(page2); 

Es evidente que la persona que escribió esto (ya hace algún tiempo, afortunadamente) no se dieron cuenta de que un Response.Redirect no, por defecto, termina el hilo.

No tengo ni idea de cuáles son las consecuencias de hacer esto, pero un rastro de este aspecto de violín muestra una redirección corrupta. Esto podría ser una coincidencia, por supuesto, pero este es el único lugar donde hemos visto este problema.

0

Uso 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.

Funciona mejor que el método anterior Status Code=301.

1

En MVC, puede ver esto después de un RedirectToRoute().

Si utiliza una herramienta como Fiddler, debería ver un problema con la respuesta del servidor. Me di cuenta de 500 Error.

En mi caso, esto fue causado por un objeto que se añade a Sesión que era NO Serializable.

2

Otra razón por la que esto podría suceder es que está redirigiendo desde una página https a una página http. Al cambiar la URL de redireccionamiento para que también sea https: // solucioné el problema por mí.

+0

Este fue el problema para mí también, gracias! – Guven

2

Esto hizo el truco para mí cuando vi este tema:

[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; 
    } 
} 
0

He arreglado este problema mediante el establecimiento de mi variable de cadena mundial de estática, porque mi URL fue restableciendo con vaciar cuando estaba a redirigir.

Cuestiones relacionadas