2016-03-03 39 views
1

我在我的wpf應用程序中使用NancyFX構建了一個自託管的REST API。該應用程序用於更新固件並運行通過USB電纜連接到計算機的不同消費品的診斷。在NancyFX的RequestStartup中檢查路由是否有效

產品必須連接到計算機才能使用該API。所以我認爲在WindsorNancyBootstrapper的覆蓋RequestStartup()方法中檢查是很明智的,這意味着檢查可以在一個位置完成,而不是在每個模塊中完成。它按預期工作。如果產品未連接,則沒有模塊處理該請求。

但是,這導致在以下情況下不必要的副作用:

  • 的產品沒有連接到計算機
  • 路徑無效

這將始終返回404並顯示一條消息,指出該設備未連接,而不是「錯誤的網址」消息。我可以將支票移動到每個模塊,但我討厭這樣做。我想:

  • 如果url是無效的,如果有一個連接的設備不管,總是返回404「錯誤的URL」應答,而不涉及任何模塊
  • 如果URL是有效的,但沒有連接的設備,返回400「沒有連接的設備」,不涉及任何模塊

我想在一個地方做到這一點。我已經四處尋找解決方案,但我沒有找到任何東西。我在想,也許我的做法是死路一條。畢竟,我正在使用BeforeRequest管道,這可能意味着無法驗證URL嗎?

我的方法(簡化)看起來像這樣的時刻:

protected override void RequestStartup(IWindsorContainer container, IPipelines pipelines, NancyContext context) 
{ 
    pipelines.BeforeRequest.AddItemToEndOfPipeline(ctx => 
    { 
     // TODO: Here I would like to check if the url is valid in order to be able to return a 404 "bad url" response 

     if (!_hasConnectedDevice) 
     { 
      // ResponseBase is my base class for all my JSON responses 
      var response = new ResponseBase(ctx.Request.Url, Messages.DeviceNotConnected); 
      return new JsonResponse(response, new DefaultJsonSerializer()) 
      { 
       StatusCode = HttpStatusCode.NotFound 
      }; 
     } 
     if (!_deviceIsReady) 
     { 
      var response = new ResponseBase(ctx.Request.Url, Messages.DeviceNotReady); 
      return new JsonResponse(response, new DefaultJsonSerializer()) 
      { 
       StatusCode = HttpStatusCode.BadRequest 
      }; 
     } 


     return null; 
    }); 

    // Catch all unhandled exceptions here. 
    pipelines.OnError += (ctx, ex) => 
    { 
     var response = new ResponseBase(ctx.Request.Url, ex.Message); 
     return new JsonResponse(response, new DefaultJsonSerializer()) 
     { 
      StatusCode = HttpStatusCode.InternalServerError 
     }; 
    }; 
} 

回答

0

我能想到這樣做會在您創建一個擴展做同樣的事情到了我們安全做的最好的方法方法在INancyModule上添加一些東西給Pipline,檢查設備是否插入並準備就緒,如果不是,則返回相關的狀態碼,否則它只返回null,然後在每個模塊中只需要添加添加的USB設備:

this.RequiresUsbThings(); //或者任何你想叫它:)

+0

是的,我可以檢查每個模塊中連接的設備,但我寧願在一箇中心位置執行此檢查,如果可能的話。 :) – sundown

+0

我知道,但我不認爲有任何方法可以做到這一點,並檢查路線是否有效,因此我的建議:) –