首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nancy路由导致404

Nancy路由导致404
EN

Stack Overflow用户
提问于 2012-09-22 04:33:53
回答 2查看 2.2K关注 0票数 2

我继承了一个WCF项目,其中包含一些构造糟糕的路由(可以工作),我需要将它们迁移到新的NancyFx项目中。我需要能够在我的Nancy应用程序中定义响应相同GET请求的路由。我暂时不能更改路线。

在WCF项目中,GET请求...

代码语言:javascript
复制
http://localhost:12345/webapi/GetUsers?UserId=567&Language=en

匹配此UriTemplate:

代码语言:javascript
复制
UriTemplate = "GetUsers?UserId={userId}&Language={language}

我希望这在南希也是一样的。

代码语言:javascript
复制
Get["/GetUsers?UserId={userId}&Language={language}"] = p => { ... }

但是相同的GET请求会导致404。

有没有办法组织我的Nancy路由来响应这个GET请求?如果没有,有什么变通办法吗?

我知道这很可怕,但这是暂时的,直到我可以安排时间与我们的UI团队重写前端,以调用适当的rest-full URL。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-22 05:13:24

约翰

您的路由将是/GetUsers (顺便问一下,您是如何处理/webapi部分的?这是你的应用程序的基本url,还是你在设置一个模块路径?)您将使用Request.Query成员读取查询字符串。

查询属性返回一个DynamicDictionary,使您能够以属性Request.Query.UserId或字典Request.Query["UserId"]的形式访问值

您不能将query-string作为需要匹配才能调用路由的模式的一部分。如果确实需要,您可以使用路由条件,这是路由声明中的第二个参数。这让您可以控制一个谓词,该谓词决定是否可以使用该路由。所以你可以做这样的事情

代码语言:javascript
复制
Get["/GetUsers", ctx => ctx.Request.Query.UserId.HasValue && ctx.Request.Query.Language.HasValue] = p {... }

然后,您可以将其全部重构为NancyContext上的扩展方法,这会使其更整洁一些

代码语言:javascript
复制
Get["/GetUsers", ctx => ctx.HasQueryValues("UserId", "Language")] = p {... }

并使扩展名类似于

代码语言:javascript
复制
public static bool HasQueryValues(this NancyContext context, params string[] values)
{
   return values.All(x => context.Request.Query[x].HasValue);
}

希望这能有所帮助!

票数 8
EN

Stack Overflow用户

发布于 2012-09-23 01:03:34

在@TheCodeJunkie的回答之后,我对他扩展NancyContext以提供预先检查Query值以确保请求有效的路由条件的想法感到有点兴奋。我进一步扩展了我的NancyContext,为Form值、Header集合甚至Files集合提供相同的预检查,如下所示:

代码语言:javascript
复制
public static bool HasQuery(this NancyContext context, params string[] values)
{
    var query = context.Request.Query;
    return values.All(value => query[value].HasValue);
}

public static bool HasForm(this NancyContext context, params string[] values)
{
    var form = context.Request.Form;
    return values.All(value => form[value].HasValue);
}

public static bool HasHeader(this NancyContext context, params string[] values)
{
    var headers = context.Request.Headers;
    return values.All(value => !headers[value].FirstOrDefault().IsEmpty());
}

public static bool HasFile(this NancyContext context, params string[] values)
{
    var files = context.Request.Files;
    return values.All(value => files.Any(file => file.Key == value));
}

这使得我可以删除验证查询和表单值的仪式性代码(当我记得这样做的时候,并不是每次都是这样)。因此,你可以获得更清晰的代码,更容易阅读,也更容易记住首先要做的检查,例如:

之前的

代码语言:javascript
复制
Post["/"]=_=>
{
    var form = Request.Form;
    if (
        !form.username.HasValue ||
        !form.password.HasValue ||
        !form.email.HasValue ||
        !form.claim.HasValue)
    {
        return HttpStatusCode.UnprocessableEntity;
    }
    //process form values with confidence
}

之后的

代码语言:javascript
复制
Post["/", ctx => ctx.HasForm("username", "password", "email", "claim")]=_=>
{
    //process form values with confidence   
};
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12537816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档