2017-02-10 61 views
0

我使用南希創建一個web api。我有一個從用戶傳入進行身份驗證的已簽名令牌。此認證在我自己的引導程序中的RequestStartup方法中完成。現在在某些情況下,例如當我無法識別簽名的令牌時,我想只能拋出一個異常,並讓它在南希的OnError hanhdler中處理。但是在RequestStartup之前引發的異常未被捕獲。該請求會生成500錯誤,我想用我自己的錯誤信息返回其他內容。南希在RequestStartup異常

我有一個明顯的例子,我拋出一個異常,但也有在GetIdentity()方法拋出異常的可能性。

我正在尋找如何處理這個任何輸入。

protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context) 
    { 
     base.RequestStartup(container, pipelines, context); 

     pipelines.OnError.AddItemToStartOfPipeline((ctx, exception) => 
       container.Resolve<IErrorHandler>().HandleException(ctx, exception)); 

     var identity = container.Resolve<IAuthenticationController>().GetIdentity(); 
     var configuration = new StatelessAuthenticationConfiguration(_ => identity); 
     StatelessAuthentication.Enable(pipelines, configuration); 

     var logManager = new LogManager(context); 
     pipelines.AfterRequest.AddItemToEndOfPipeline(_ => logManager.Log()); 

     try 
     { 
      X509Certificate2 clientCert = context.Request.ClientCertificate as X509Certificate2; 
      container.Resolve<ICertificateValidator>().Validate(clientCert); 
     } 
     catch (Exception ex) 
     { 
      throw new MklServerAuthenticationException(ErrorCodes.WrongOrNonexistingCertificate, ex); 
     } 
    } 

回答

0

找出解決上述問題的方法,並認爲其他人可能想知道。替換上面我的代碼行,包含的getIdentity()調用,具有下列內容:

 Identity identity = null; 
     try 
     { 
      identity = container.Resolve<IAuthenticationController>().GetIdentity(requestInfo); 
     } 
     catch (Exception ex) 
     { 
      var exception = new MklAuthentcationException(ErrorCodes.TokenInvalid, ex); 
      context.Response = container.Resolve<IErrorHandler>().HandleException(context, exception); 
      pipelines.BeforeRequest.Invoke(context, CancellationToken.None); 
     } 

我使用南錫所陳述的事實:

的PreRequest掛鉤被稱爲前處理請求。如果一個鉤子返回一個非空的響應,那麼處理將被中止並返回提供的響應。

因此,通過在PreRequest鉤子上設置一個響應(在這種情況下,我的錯誤)並調用它,我的錯誤被返回並停止執行。

也許不是最好的解決方案...如果你能找出更好的東西,請讓我知道。

+0

或者說,上述實現了BeforeRequest鉤子並在那裏做你的東西。 – TOMTEFAR