2012-08-23 1 views
7

私は、ロールを使用してアクセスを制限するクラス(DPCal_EventMove)のメソッドを1つ持っています。 Global.asax.csエラーハンドラとカスタムIHttpModuleエラーハンドラの両方が処理されない例外を捕捉し、Server.TransferをGlobalExceptionHandler.aspxに渡して、エラーがPrincipalPermissionのチェックに失敗したSecurityExceptionsであるかどうかを確認します。何らかの理由で、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:DayPilotCalendarコントロールのEventMoveHandlingプロパティを「CallBack」ではなく「PostBack」に変更すると、セキュリティ例外を捕捉して処理することができました。あなたのページのコードに

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

をしているが、エラー時に呼び出されたかどうかを確認:

+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

を追加しますか?

関連する問題