2012-08-23 323 views
7

我有一個類(DPCal_EventMove)的方法,我想限制使用角色的訪問權限。我有一個Global.asax.cs錯誤處理程序和一個自定義IHttpModule錯誤處理程序,用於捕獲未處理的異常和Server。將它們轉換爲GlobalExceptionHandler.aspx,該錯誤處理程序檢查錯誤是否源自失敗的PrincipalPermission檢查的SecurityException。出於某種原因,由PricipalPermission-decorated方法引起的未處理的異常不會通過任何一個錯誤處理程序進行路由。我的問題是:這個異常被傳送到哪裏以及如何捕獲和處理它?未處理的異常未被Global.asax錯誤處理程序或自定義IHttpModule錯誤處理程序捕獲

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的處理程序:永遠不會達成GlobalExceptionHandler.aspx

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。

+0

我認爲這個鏈接可能有一些很好的信息給你:http://stackoverflow.com/questions/2192093/wcf-principalpermission-attribute-exception-loggin –

+1

如果你在通過WebMethod進行頁面回調時出錯,你將不得不在客戶端處理錯誤。 (1)調用'DPCal_EventMove'和(2)'DPCal_EventMove'的定義時,您可能會發佈一個(簡化版)代碼嗎? –

回答

1

原來,這個問題是因爲DPCal_EventMove方法作爲頁面回調執行造成的。幸運的是,DayPilot日曆組件可以選擇更改此行爲。一旦我將DayPilot的EventMoveHandling屬性DayPilotCalendar控件更改爲「PostBack」而不是「CallBack」,我就能夠捕獲並處理安全異常。

+0

我指的是這個組件:http://www.daypilot.org/ – Matt

0

你試過:

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

我不知道如何可以幫助。 Application_Error永遠不會被調用(通過在方法的開始處放置一個斷點來確認)。 – Matt

+0

我已經在一個簡單的項目上驗證了上面的代碼(僅僅爲了我自己的滿足感),並且實際上,如果您執行傳輸,則不需要ClearErrors()。是否有可能使用web.config中的CustomError節點覆蓋標準行爲? –

+0

是什麼在我的web.config – Matt

0

地址:

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

要在網頁的代碼,看看這是一個錯誤時叫什麼名字?