为什么没有查询参数传递给我的NancyFX模块?

时间:2013-08-18 19:28:46

标签: c# nancy

我正在我的应用程序中运行一个自托管的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);
        };
    }
}

我的Bootstrapper类是:

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个值都为空。

我做错了什么?

编辑:当我在网络浏览器中启动此端点时,会出现同样的问题。我得到0的结果发送回我的浏览器,但是在调试时我看到NancyFX没有识别出我指定的查询字符串参数。

2 个答案:

答案 0 :(得分:21)

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

这也适用于您的测试。

答案 1 :(得分:2)

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

public class RequestObject 
{
    public string Start { get; set; }
    public string End { get; set; }
    public string Metrics { get; set; }
}

/查询开始= 2015年9月27日&安培;端= 2015年10月27日&安培;度量=加载时

Get["/query"] = x =>
{
    var request = this.Bind<RequestObject>();
}