2017-02-10 34 views
0

Я использую Nancy для создания веб-api. У меня есть подписанный токен, который передается от пользователя для аутентификации. Эта проверка подлинности выполняется в методе RequestStartup в моем собственном Bootstrapper. Теперь, в некоторых случаях, например, когда я не могу смириться с подписанным токеном, я хотел бы просто создать исключение и обработать его с помощью OnError hanhdler в Nancy. Однако исключение, возникшее до того, как RequestStartup будет финишировано, не поймано. Запрос генерирует ошибку 500, и я хотел бы вернуть что-то еще с моей собственной информацией об ошибке.Nancy Exception in 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); 
     } 

Я использую тот факт, указанный в Nancy, что:

PreRequest хук вызываются до обработка запроса. Если крючок возвращает ненулевой ответ, обработка прерывается и возвращается ответ.

Итак, установив ответ (моя ошибка в этом случае) на крючок PreRequest и вызывая его, моя ошибка возвращается и выполнение прекращается.

Возможно, не самое приятное решение ... Если вы можете выяснить что-то лучше, пожалуйста, дайте мне знать.

+0

Вернее, что вышеперечисленное реализовано на крючке BeforeRequest и сделайте свой материал там. – TOMTEFAR