Необработанное исключение не перехватывается ни обработчиком ошибок Global.asax, ни пользовательским обработчиком ошибок IHttpModule

У меня есть один метод класса (DPCal_EventMove), который я хочу ограничить доступ к использованию ролей. У меня есть и обработчик ошибок Global.asax.cs, и пользовательский обработчик ошибок IHttpModule, предназначенный для перехвата необработанных исключений, и Server.Transfer их в GlobalExceptionHandler.aspx, который проверяет, являются ли ошибки SecurityExceptions, которые произошли из-за неудачных проверок PrincipalPermission. По какой-то причине необработанное исключение, вызванное методом-украшением PricipalPermission, не маршрутизируется ни одним из моих обработчиков ошибок. Мой вопрос: куда направляется это исключение и как мне его перехватить и обработать?

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

Ниже мой файл Global.asax.cs:

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

Ниже мой пользовательский обработчик 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 на GlobalExceptionHandler.aspx никогда не достигается.

3 ответа

Решение

Оказалось, что проблема была вызвана тем, что метод DPCal_EventMove выполнялся как обратный вызов страницы. К счастью, компонент календаря DayPilot имеет возможность изменить это поведение. Как только я изменил свойство EventMoveHandling элемента управления DayPilot:DayPilotCalendar на "PostBack" вместо "CallBack", я смог перехватить и обработать исключение безопасности.

Добавлять:

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

На код вашей страницы и посмотреть, если это вызывается во время ошибки?

Ты пытался:

public class Global : System.Web.HttpApplication
{
    protected void Application_Error(object sender, EventArgs e)
    {
        Server.Transfer("~/GlobalExceptionHandler.aspx?ReturnUrl=" + Request.Path);
    }
}
Другие вопросы по тегам