我在我的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
};
};
}
是的,我可以檢查每個模塊中連接的設備,但我寧願在一箇中心位置執行此檢查,如果可能的話。 :) – sundown
我知道,但我不認爲有任何方法可以做到這一點,並檢查路線是否有效,因此我的建議:) –