Joh*_*n L 2 wcf http-status-code-404 nancy
我继承了一个WCF项目,其中包含一些构建错误的路由(可以工作),我需要迁移到新的NancyFx项目中.我需要能够在我的Nancy应用程序中定义响应相同GET请求的路由.我暂时无法改变路线.
在WCF项目中,GET请求...
http://localhost:12345/webapi/GetUsers?UserId=567&Language=en
Run Code Online (Sandbox Code Playgroud)
匹配这个UriTemplate:
UriTemplate = "GetUsers?UserId={userId}&Language={language}
Run Code Online (Sandbox Code Playgroud)
我希望这在南希是等同的
Get["/GetUsers?UserId={userId}&Language={language}"] = p => { ... }
Run Code Online (Sandbox Code Playgroud)
但是相同的GET请求导致404.
有没有办法构建我的Nancy路由来响应这个GET请求?如果没有,任何解决方案?
我知道这是可怕的,但它是暂时的,直到我可以安排时间与我们的UI团队重写前端来调用正确的休息完整URL.
约翰,
你的路线是/GetUsers(/webapi顺便提一下你是如何处理这个部分的?这是你的应用程序的基本URL还是你设置了一个模块路径?)你会使用该Request.Query成员读取查询字符串.
Query属性返回a DynamicDictionary,使您可以将值作为属性Request.Query.UserId或字典进行访问Request.Query["UserId"]
您不能使查询字符串成为需要匹配的模式的一部分,以便调用路由.如果你真的想要,你可以做的是使用路由条件,这是路由声明中的第二个参数.这使您可以控制谓词,该谓词确定路径是否可以使用.所以你可以这样做
Get["/GetUsers", ctx => ctx.Request.Query.UserId.HasValue && ctx.Request.Query.Language.HasValue] = p {... }
Run Code Online (Sandbox Code Playgroud)
然后你可以将它全部重构为NancyContext上的扩展方法,这使得它更加整洁
Get["/GetUsers", ctx => ctx.HasQueryValues("UserId", "Language")] = p {... }
Run Code Online (Sandbox Code Playgroud)
并使扩展类似
public static bool HasQueryValues(this NancyContext context, params string[] values)
{
return values.All(x => context.Request.Query[x].HasValue);
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
继@TheCodeJunkie的回答之后,我有点过度兴奋他的想法是扩展NancyContext提供预先检查Query值以确保请求有效的路由条件.我进一步扩展了我NancyContext对Form值,Header集合甚至Files集合提供相同的预检查,如下所示:
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));
}
Run Code Online (Sandbox Code Playgroud)
这使我可以删除验证查询和表单值的仪式代码(当我记得这样做时,结果并非每次都这样).因此,您可以获得更易于阅读且更易于记忆的清洁代码,例如:
之前
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
}
Run Code Online (Sandbox Code Playgroud)
后
Post["/", ctx => ctx.HasForm("username", "password", "email", "claim")]=_=>
{
//process form values with confidence
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2099 次 |
| 最近记录: |