为啥没有查询参数被传递到我的 NancyFX 模块?

Posted

技术标签:

【中文标题】为啥没有查询参数被传递到我的 NancyFX 模块?【英文标题】:Why are no query parameters being passed to my NancyFX module?为什么没有查询参数被传递到我的 NancyFX 模块? 【发布时间】:2013-08-20 14:32:32 【问题描述】:

我在我的应用程序中运行一个自托管的 NancyFX Web 服务器。现在我托管了一个模块:

public class MetricsModule : NancyModule

    private IStorageEngine _storageEngine;

    public MetricsModule(IStorageEngine storageEngine) : base("/metrics")
    
        _storageEngine = storageEngine;

        Get["/list"] = parameters =>
        
            var metrics = _storageEngine.GetKnownMetrics();
            return Response.AsJson(metrics.ToArray());
        ;

        Get["/query"] = parameters =>
        
            var rawStart = parameters.start;
            var rawEnd = parameters.end;
            var metrics = parameters.metrics;

            return Response.AsJson(0);
        ;
    

我的引导程序类是:

public class OverlookBootStrapper : DefaultNancyBootstrapper

    private readonly IStorageEngine _storageEngine;

    public OverlookBootStrapper(IStorageEngine storageEngine)
    
        _storageEngine = storageEngine;
    

    protected override void ConfigureApplicationContainer(TinyIoCContainer container)
    
        container.Register(_storageEngine);
    

我正在尝试使用以下测试对其进行测试:

    [TestInitialize]
    public void Init()
    
        _storageEngine = new Mock<IStorageEngine>();

         var bootstrapper = new OverlookBootStrapper(_storageEngine.Object);
         _browser = new Browser(bootstrapper);
    

    [TestMethod]
    public void Query_Builds_Correct_Query_From_Parameters()
    
        var metric = new Metric("device", "category", "name", "suffix");
        var startDate = DateTime.Now;
        var endDate = DateTime.Now.AddMinutes(10);
        var path = "/metrics/query";

        var response = _browser.Get(path, with =>
        
            with.HttpRequest();
            with.Query("start", startDate.ToString());
            with.Query("end", endDate.ToString());
            with.Query("metrics", metric.ToParsableString());
        );

        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, "Incorrect status code returned");
        _storageEngine.Verify(x => x.ExecuteQuery(It.Is<Query>(y => y.StartDate == startDate)), Times.Once());
        _storageEngine.Verify(x => x.ExecuteQuery(It.Is<Query>(y => y.EndDate == endDate)), Times.Once());
        _storageEngine.Verify(x => x.ExecuteQuery(It.Is<Query>(y => y.Metrics.Contains(metric))), Times.Once());
    

当调试此测试并在return Response.AsJson(0); 上放置断点时,我检查了参数对象并注意到parameters.Count 为零,并且所有3 个值都为空。

我做错了什么?

编辑:当我在 Web 浏览器中打开此端点时,会出现同样的问题。我将 0 的结果发送回我的浏览器,但在调试时我发现我指定的查询字符串参数没有被 NancyFX 识别。

【问题讨论】:

【参考方案1】:

您的 lambda 的 parameters 参数包含您在 Get["/query"] 中捕获的路由参数。在这种情况下什么都没有。请参阅@thecodejunkie 的评论,了解有什么问题的示例。

要获取查询参数,请使用Request.Query。这也是一个动态的,将包含请求中的任何查询参数。像这样:

 Get["/query"] = parameters =>
    
        var rawStart = Request.Query.start;
        var rawEnd = Request.Query.end;
        var metrics = Request.Query.metrics;

        return Response.AsJson(0);
    ;

这也应该适用于您的测试。

【讨论】:

哦,这很有道理,但是传入的参数字典是做什么用的? 它们用于路由参数,例如/user/id,因此您可以获得parameters.id【参考方案2】:

您可以让 NancyFx 的模型绑定处理 url 查询字符串。

public class RequestObject 

    public string Start  get; set; 
    public string End  get; set; 
    public string Metrics  get; set; 

/query?start=2015-09-27&end=2015-10-27&metrics=loadtime

Get["/query"] = x =>

    var request = this.Bind<RequestObject>();

【讨论】:

以上是关于为啥没有查询参数被传递到我的 NancyFX 模块?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的自托管 NancyFX 应用程序在通过 HTTPS 运行时会挂起?

为啥没有在 Verilog 中正确传递参数?

如何返回 404 状态,其中无效参数被传递到我的 ASP.NET MVC 控制器?

为啥垃圾被添加到我的 mongodb 中?

为啥垃圾被添加到我的 mongodb 中?

为啥将错误的指针从 C# 传递到我的本机导出方法中?