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

我正在我的应用程序内运行一个自托管的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(); 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(y => y.StartDate == startDate)), Times.Once()); _storageEngine.Verify(x => x.ExecuteQuery(It.Is(y => y.EndDate == endDate)), Times.Once()); _storageEngine.Verify(x => x.ExecuteQuery(It.Is(y => y.Metrics.Contains(metric))), Times.Once()); } 

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

我做错了什么?

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

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

这也适用于您的测试。

您可以让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(); }