2009-10-08 132 views
11

Estoy limpiando algún código de framework heredado y una gran cantidad de él simplemente está codificando por excepción. No se verifican los valores para ver si son nulos, y como resultado, se lanzan y atrapan grandes cantidades de excepciones.Cómo evitar "Response.Redirect no se puede llamar en una devolución de llamada de página"

Tengo la mayoría de ellos limpiados, sin embargo, hay algunos métodos de marco de trabajo de error/inicio de sesión/seguridad que están haciendo Response.Redirect y ahora que estamos usando ajax, estamos recibiendo MUCHO de "Response .Redirect no se puede llamar en una devolución de llamada de página ". Y me gustaría evitar esto si es posible.

¿Hay alguna manera de evitar programáticamente esta excepción? Busco algo así como

if (Request.CanRedirect) 
    Request.Redirect("url"); 

Nota, esto también está ocurriendo con Server.Transfer, por lo que me gustaría ser capaz de verificar si soy capaz de hacer Request.Redirect O Server.Transfer.

Actualmente, es simplemente hacer esto

try 
{ 
    Server.Transfer("~/Error.aspx"); // sometimes response.redirect 
} 
catch (Exception abc) 
{ 
    // handle error here, the error is typically: 
    // Response.Redirect cannot be called in a Page callback 
} 

Respuesta

13

Puede probar

if (!Page.IsCallback) 
    Request.Redirect("url"); 

o si usted no tiene una página muy útil ...

try 
{ 
    if (HttpContext.Current == null) 
     return; 
    if (HttpContext.Current.CurrentHandler == null) 
     return; 
    if (!(HttpContext.Current.CurrentHandler is System.Web.UI.Page)) 
     return; 
    if (((System.Web.UI.Page)HttpContext.Current.CurrentHandler).IsCallback) 
     return; 

    Server.Transfer("~/Error.aspx"); 
} 
catch (Exception abc) 
{ 
    // handle it 
} 
+0

Dónde en HttpContext.Current puedo encontrar IsCallback? No siempre tendré una Página –

+0

Ah, lo encontré, agregué el código que terminé usando a tu respuesta, ya que tu fragmento es realmente todo lo que necesitaba. No puedo creer que no haya pensado en algo tan simple yo mismo, je. Gracias hombre –

1

Usted debe cargar su ScriptManager o ScriptManagerProxy, y luego verifique el indicador IsInAsyncPostBack. Eso sería algo como esto:

ScriptManager sm = this.Page.Form.FindControl("myScriptManager") as ScriptManager; 
if(!sm.IsInAsyncPostBack) 
{ 
    ... 
} 

Al hacer esto, usted puede mezclar las devoluciones de datos asincrónicos (que dejare de redirigir) con las devoluciones de datos normales, que estoy asumiendo que todavía quiere volver a dirigir.

+0

hrm, ¿podría explicarnos cuál es la diferencia entre eso y Page.IsCallback? –

+0

Parece que la diferencia es que IsCallback funciona para la interfaz Asp.net ICallbackEventHandler, mientras que IsInAsyncPostBack funciona para los cambios basados ​​en UpdatePanel. Esta es la comparación más directa entre ellos que pude encontrar: http://timstall.dotnetdevelopersjournal.com/avoiding_unnecessary_server_work_in_aspnet.htm –

+1

también puede utilizar ScriptManager.GetCurrent (Página); – Karsten

6

Creo que simplemente puede reemplazar Server.Transfer() con Response.RedirectLocation() que funciona durante la devolución de llamada.

try 
{ 
    Response.RedirectLocation("~/Error.aspx"); // sometimes response.redirect 
} 
catch (Exception abc) 
{ 
    // handle error here, the error is typically: 
    // Response.Redirect cannot be called in a Page callback 
} 
+1

Para el registro, encuentro (ASP.NET 4.x) que a) 'Response.RedirectLocation' es una propiedad, no un método, yb) no expande la notación' ~ ', por lo que necesita' Response.RedirectLocation = Page.ResolveUrl ("~/Error.aspx") '. – JonBrave

1

Como se mencionó anteriormente, pero se amplió para incluir la versión 4.x .NET y asignar a la propiedad Response.RedirectLocation cuando no hay Page disponible.

try 
{ 
    HttpContext.Current.Response.Redirect("~/Error.aspx"); 
} 
catch (ApplicationException) 
{ 
    HttpContext.Current.Response.RedirectLocation =  
         System.Web.VirtualPathUtility.ToAbsolute("~/Error.aspx"); 
} 
Cuestiones relacionadas