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

C# Global.asax错误处理程序或自定义IHttpModule错误处理程序未捕获未处理的异常,c#,asp.net,error-handling,principalpermission,C#,Asp.net,Error Handling,Principalpermission,我有一个类的方法(DPCal_EventMove),我想限制对使用角色的访问。我有一个Global.asax.cs错误处理程序和一个自定义IHttpModule错误处理程序,用于捕获未处理的异常和服务器。将它们传输到GlobalExceptionHandler.aspx,后者将检查错误是否是源自失败的PrincipalPermission检查的SecurityException。由于某些原因,PricipalPermission修饰方法导致的未处理异常不会通过我的任何一个错误处理程序进行路由。我

我有一个类的方法(DPCal_EventMove),我想限制对使用角色的访问。我有一个Global.asax.cs错误处理程序和一个自定义IHttpModule错误处理程序,用于捕获未处理的异常和服务器。将它们传输到GlobalExceptionHandler.aspx,后者将检查错误是否是源自失败的PrincipalPermission检查的SecurityException。由于某些原因,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);
    }
}
无法访问GlobalExceptionHandler.aspx上的页面加载。

您尝试过:

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

结果表明,问题是由于DPCal_EventMove方法作为页面回调执行而导致的。幸运的是,DayPilot日历组件具有更改此行为的选项。一旦我将DayPilot:DayPilotCalendar控件的EventMoveHandling属性更改为“回发”而不是“回调”,我就能够捕获并处理安全异常。

添加:

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

查看页面的代码,看看是否在出错时调用了该代码?

我认为此链接可能为您提供了一些好信息:如果您在通过WebMethod进行页面回调时出错,则必须在客户端正确处理错误。当(1)调用
DPCal\u EventMove
和(2)调用
DPCal\u EventMove
时,您是否可以发布一个(简化)版本的代码?我不确定这会有什么帮助。应用程序_Error从未被调用(通过在方法的开头放置断点来确认)。我已经在一个简单的项目上验证了上述代码(只是为了满足我自己的需要),事实上,如果执行传输,则不需要ClearErrors()。您是否可能正在使用web.config中的CustomError节点覆盖标准行为?是my web.Config中的内容如果未调用应用程序_错误,会发生什么?我假设异常正在被掩埋?异常实际上显示为一个弹出对话框,而不是通常的死亡黄屏。我最近的预感是,这可能与调用DPCal_EventMove是一个页面回调有关,尽管我不确定这有什么关系。