2017-02-10 3 views
0

私はWeb APIを作成するためにNancyを使用しています。私は、認証するためにユーザーから渡される署名付きトークンを持っています。この認証は、自分のBootstrapperのRequestStartupメソッドで実行されます。今や、いくつかのケースでは、例えば、署名されたトークンをうまく使用できないときに、例外をスローして、それをナンシーのOnErrorハンドラで処理できるようにしたいとします。しかし、RequestStartupが呼び出される前にスローされた例外は捕捉されません。リクエストによって500のエラーが発生し、私自身のエラー情報で何か他のものを返したいと思います。RequestStartupのNancy例外

私は例外をスローする明白なケースがありますが、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

上記の問題を解決する方法を考え出し、他の人が知りたいと思っていることを考え出しました。

 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); 
     } 

を私はナンシーという点で述べた事実を使用しています:以下で、GetIdentity()呼び出しを含む、上記の私のコードの行を置き換え

PreRequestフックは前に呼ばれ

リクエストを処理します。フックがnull以外の応答を返した場合、処理は中止され、返された応答が返されます。

PreRequestフックで応答(この場合はエラー)を設定して呼び出すと、エラーが返され、実行が停止されます。

おそらく最も良い解決策ではないかもしれません...あなたが何かをより良く理解できる場合は、私に知らせてください。

+0

または、上記のようにBeforeRequestフックを実装して、そこにあなたのものを実行してください。 – TOMTEFAR

関連する問題