C# 在NancyFX的RequestStartup中检查路由是否有效

C# 在NancyFX的RequestStartup中检查路由是否有效,c#,.net,rest,nancy,self-hosting,C#,.net,Rest,Nancy,Self Hosting,我的wpf应用程序中有一个自托管RESTAPI,它是使用NancyFX构建的。该应用程序用于更新固件并在使用USB电缆连接到计算机的不同消费品上运行诊断 产品必须连接到计算机才能使用API。因此,我认为在WindsorNancyBootstrapper中重写的RequestStartup()方法中执行此检查是明智的,这意味着可以在一个位置而不是在每个模块中执行此检查。它像预期的那样工作。如果产品未连接,则任何模块都不会处理该请求 但在以下情况下,这会导致不必要的副作用: 产品未连接到计算机 路

我的wpf应用程序中有一个自托管RESTAPI,它是使用NancyFX构建的。该应用程序用于更新固件并在使用USB电缆连接到计算机的不同消费品上运行诊断

产品必须连接到计算机才能使用API。因此,我认为在WindsorNancyBootstrapper中重写的RequestStartup()方法中执行此检查是明智的,这意味着可以在一个位置而不是在每个模块中执行此检查。它像预期的那样工作。如果产品未连接,则任何模块都不会处理该请求

但在以下情况下,这会导致不必要的副作用:

  • 产品未连接到计算机
  • 路径无效
这将始终返回一条404消息,其中显示设备未连接,而不是“坏url”消息。我可以将支票移动到每个模块,但我讨厌这样做。我想要的是:

  • 如果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
        };
    };
}

我能想到的最好的方法是做一些类似于安全性的事情,在Inacymodule上创建一个扩展方法,在管道上添加一些东西,检查设备是否已插入并准备就绪,如果未插入,则返回相关的状态码,否则只返回null,然后,在每个模块中,您只希望使用添加的USB设备:


这个。requiressbings();//或者不管你想叫它什么:)

我能想到的最好的方法是做一些类似于我们对安全性所做的事情,在Inacymodule上创建一个扩展方法,在管道上添加一些东西,检查设备是否已插入并准备就绪,如果未插入,则返回相关的状态代码,否则,它只返回null,然后在每个模块中,您只希望使用您添加的USB设备:


这个。requiressbings();//或者您想叫它什么:)

是的,我可以在每个模块中检查连接的设备,但如果可能的话,我宁愿在一个中心位置执行此检查。:)我知道,但我不认为有任何方法可以做到这一点,同时检查路由是否有效,因此我建议:)是的,我可以检查每个模块中是否有连接的设备,但如果可能,我宁愿在一个中心位置执行此检查。:)我知道,但我不认为有任何方法可以做到这一点,同时还要检查路线是否有效,因此我建议:)