2012-08-23 7 views
7

Tengo un método de una clase (DPCal_EventMove) al que quiero limitar el acceso mediante Roles. Tengo un controlador de errores Global.asax.cs y un manejador de errores IHttpModule personalizado para capturar las excepciones no controladas y el Servidor. Transferirlos a GlobalExceptionHandler.aspx, que verifica si los errores son SecurityExceptions que se originaron de comprobaciones de PrincipalPermission fallidas. Por alguna razón, la excepción no controlada causada por el método decorado por PricipalPermission no se enruta a través de ninguno de mis controladores de errores. Mi pregunta es: ¿a dónde se dirige esta excepción y cómo la atrapo y manejo?Excepción no controlada no detectada por el controlador de error Global.asax o el controlador de error personalizado IHttpModule

public partial class DayView : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // Do some stuff 
    } 

    [PrincipalPermission(SecurityAction.Demand, Role = "Investigator")] 
    [PrincipalPermission(SecurityAction.Demand, Role = "Administrator")] 
    protected void DPCal_EventMove(object sender, DayPilot.Web.Ui.Events.EventMoveEventArgs e) 
    { 
     // If no overlap, then save 
     int eventId = Convert.ToInt32(e.Value); 
     MembershipUser user = Membership.GetUser(); 
     if (!CommonFunctions.IsSchedulingConflict(eventId, e.NewStart, e.NewEnd) && 
      Page.User.HasEditPermission(user, eventId)) 
     { 
      dbUpdateEvent(eventId, e.NewStart, e.NewEnd); 
      GetEvents(); 
      DPCal.Update(); 
     } 
    } 
} 

A continuación es mi archivo Global.asax.cs:

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Error(object sender, EventArgs e) 
    { 
     Server.Transfer("~/GlobalExceptionHandler.aspx?ReturnUrl=" + Request.Path); 
    } 
} 

A continuación es mi costumbre manejador IHttpModule: no se alcanza nunca

public class UnhandledExceptionModule : IHttpModule 
{ 
    private HttpApplication _context; 
    private bool _initialized = false; 

    public void Init(HttpApplication context) 
    { 
     _context = context; 
     _initialized = true; 
     context.Error += new EventHandler(Application_Error); 
    } 

    public UnhandledExceptionModule() 
    { 
     _initialized = false; 
    } 

    public void Dispose() 
    { 
     if (_initialized) 
      _context.Dispose(); 
    } 

    public void Application_Error(object sender, EventArgs e) 
    { 
     if (_initialized) 
      _context.Server.Transfer("~/GlobalExceptionHandler.aspx?ReturnUrl=" + _context.Request.Path); 
    } 
} 

Load en GlobalExceptionHandler.aspx.

+0

Creo que este enlace puede tener buena información para usted: http://stackoverflow.com/questions/2192093/wcf-principalpermission-attribute-exception-loggin –

+1

Si está teniendo un error durante una devolución de llamada de página a través de un WebMethod , tendrá que manejar el error adecuadamente en el lado del cliente. ¿Podría publicar una versión (simplificada) de su código cuando (1) llame a 'DPCal_EventMove' y (2) a la definición de' DPCal_EventMove'? –

Respuesta

1

Resultó que el problema fue causado porque el método DPCal_EventMove se ejecuta como una devolución de llamada de la página. Afortunadamente, el componente de calendario DayPilot tiene una opción para cambiar este comportamiento. Una vez que cambié la propiedad EventMoveHandling del control DayPilot: DayPilotCalendar a "PostBack" en lugar de "CallBack", pude detectar y manejar la excepción de seguridad.

+0

El componente al que me refiero está aquí: http://www.daypilot.org/ – Matt

0

Ha intentado:

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Error(object sender, EventArgs e) 
    { 
     Server.Transfer("~/GlobalExceptionHandler.aspx?ReturnUrl=" + Request.Path); 
    } 
} 
+0

No estoy seguro de cómo eso podría ayudar. Application_Error nunca se llama (se confirma poniendo un punto de interrupción al comienzo del método). – Matt

+0

He verificado el código anterior en un proyecto simple (solo para mi propia gratificación), y de hecho, ClearErrors() no es necesario si realiza una transferencia. ¿Es posible que anule el comportamiento estándar con un nodo CustomError en su web.config? –

+0

es lo que está en mi web.config – Matt

0

Añadir:

private void Page_Error(object sender, System.EventArgs e) 
{ 
     //errorcode 
} 

al código de la página y ver si eso se llama durante un error?

Cuestiones relacionadas