簡體   English   中英

為什么沒有查詢參數傳遞給我的NancyFX模塊?

[英]Why are no query parameters being passed to my NancyFX module?

我正在我的應用程序中運行一個自托管的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);斷點時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<RequestObject>();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM