Почему параметры запроса не передаются в мой модуль NancyFX?
я запускаю автономный веб-сервер NancyFX внутри моего приложения. Прямо сейчас у меня есть один модуль:
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 значения равны null.
что я делаю неправильно?
Edit: когда я вызываю эту конечную точку в веб-браузере, возникает та же проблема. Я получаю результат 0, отправленный обратно в мой браузер, но при отладке я вижу, что никакие параметры строки запроса, которые я указываю, не были распознаны NancyFX.
2 ответов
на 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-09-27 & end=2015-10-27 & metrics=loadtime
Get["/query"] = x =>
{
var request = this.Bind<RequestObject>();
}