Необработанное исключение не перехватывается ни обработчиком ошибок 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);
}
}