2012-08-23 15 views
7

Ho un metodo di una classe (DPCal_EventMove) che voglio limitare l'accesso all'utilizzo di ruoli. Ho sia un gestore di errori Global.asax.cs sia un gestore di errori IHttpModule personalizzato inteso a rilevare eccezioni non gestite e Server.Transferli a GlobalExceptionHandler.aspx, che verifica se gli errori sono SecurityException originati da verifiche PrincipalPermission non riuscite. Per qualche motivo, l'eccezione non gestita causata dal metodo decorato da PricipalPermission non viene instradata da nessuno dei miei gestori di errori. La mia domanda è: dove viene indirizzata questa eccezione e come la prendo e la gestisco?Eccezione non gestita non rilevata dal gestore errori Global.asax o dal gestore errori IHttpModule personalizzato

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(); 
     } 
    } 
} 

Qui di seguito è il mio file di Global.asax.cs:

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

Qui di seguito è il mio personalizzato gestore IHttpModule:

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); 
    } 
} 

Page_Load su GlobalExceptionHandler.aspx non viene mai raggiunto.

+0

Penso che questo collegamento possa avere alcune buone informazioni per voi: http://stackoverflow.com/questions/2192093/wcf-principalpermission-attribute-exception-loggin –

+1

Se si verifica un errore durante una richiamata della pagina tramite un WebMethod , dovrai gestire l'errore in modo appropriato sul lato client. Potresti postare una versione (semplificata) del tuo codice quando (1) chiamando 'DPCal_EventMove' e (2) la definizione di' DPCal_EventMove'? –

risposta

1

si è scoperto che il problema è stato causato perché il metodo DPCal_EventMove stava eseguendo come una pagina richiamata. Fortunatamente, il componente del calendario DayPilot ha un'opzione per cambiare questo comportamento. Dopo aver modificato la proprietà EventMoveHandling del controllo DayPilot: DayPilotCalendar su "PostBack" anziché su "CallBack", sono riuscito a rilevare e gestire l'eccezione di sicurezza.

+0

Il componente a cui mi riferisco è qui: http://www.daypilot.org/ – Matt

0

Hai provato:

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

Non sono sicuro di come possa essere d'aiuto. Application_Error non viene mai chiamato (confermato inserendo un punto di interruzione all'inizio del metodo). – Matt

+0

Ho verificato il codice di cui sopra su un progetto semplice (solo per mia gratificazione), e infatti, ClearErrors() non è richiesto se si esegue un trasferimento. È possibile che tu stia ignorando il comportamento standard con un nodo CustomError nel tuo web.config? –

+0

è cosa c'è nel mio web.config – Matt

0

Add:

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

Per il codice della tua pagina e vedere se questo viene chiamato durante un errore?

Problemi correlati