未被 Global.asax 错误处理程序或自定义 IHttpModule 错误处理程序捕获的未处理异常。

7

我有一个类的方法 (DPCal_EventMove),希望能够限制只有特定角色才能访问。我写了一个全局错误处理程序(Global.asax.cs)和一个自定义的IHttpModule错误处理程序,旨在捕获未处理的异常并将其Server.Transfer到GlobalExceptionHandler.aspx进行检查,以查看是否是由于未通过PrincipalPermission检查而导致的SecurityExceptions错误。但不知为何,由PrincipalPermission修饰的方法引发的未处理异常并不会被路由到我的任何错误处理程序中。我的问题是:这个异常被路由到哪里去了?我应该如何捕获并处理它?

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

GlobalExceptionHandler.aspx页面上的Page_Load事件从未被触发。


我认为这个链接可能会对你有所帮助:https://dev59.com/V0vSa4cB1Zd3GeqPg70K - Joel Etherton
1
如果您在通过WebMethod进行页面回调时遇到错误,您将需要在客户端适当地处理该错误。您是否可以发布(简化的)代码版本,以便在调用DPCal_EventMoveDPCal_EventMove的定义时进行排查? - Jaime Torres
3个回答

1
原来问题是由于 DPCal_EventMove 方法作为页面回调执行引起的。幸运的是,DayPilot 日历组件有一个选项可以更改此行为。一旦我将 DayPilot:DayPilotCalendar 控件的 EventMoveHandling 属性从 "CallBack" 更改为 "PostBack",我就能够捕获和处理安全异常了。

0

你尝试过了吗:

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

我不确定那怎么可能有所帮助。Application_Error方法从未被调用(通过在该方法的开头设置断点进行确认)。 - Matt
我已经在一个简单的项目上验证了上述代码(只是为了满足自己的好奇心),确实,如果您执行转移,则不需要ClearErrors()。您是否在web.config中使用CustomError节点覆盖了标准行为? - Jaime Torres
我的 web.config 文件中有 <customErrors mode="Off" />。 - Matt
如果 Application_Error 没有被调用,那么会发生什么?我猜测异常只是被忽略了? - Jaime Torres
异常实际上会出现为一个弹出对话框,而不是通常的黄色死亡屏幕。我最新的猜测是,也许这与调用DPCal_EventMove作为页面回调有关,尽管我不确定为什么会有影响。 - Matt

0

地址:

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

检查你的页面代码,看看是否在错误期间被调用?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接