2020-09-22 乐帮网
mvc webapi c#
在使用webapi2时部分功能用到了路由参数,几经调试总结出一点经验,一般下面的路由的配置已经足够应对各种情况了,除非有些特殊要求可能用到路由上携带参数。常用配置如下:
//默认路由
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//自定义路由1
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
如果我想使用路由参数传值的话可能会配置中下
//自定义路由2
config.Routes.MapHttpRoute(
name: "customApi",
routeTemplate: "api/custom/{type}/{name}",
defaults: new { type = RouteParameter.Optional ,name=RouteParameter.Optional}
);
加上去可能你会发现不能正常解析到我们想到的方法里。请查看以下要点:
1、顺序, 很容易被忽略一点,假设置我们的 自定义路由1 和自定义路由2同时存在则会引发问题。可以把定制的 自定义路由2 放到最前面。
2、参数值 最容易被忽略一点
如果我在CustomController中使用get接收这两个参数,就像下面代码:
public string Get(string type,string name)
{
return $"rec:{type}.{name}";
}
理论上看着一点问题也没有,但是就是匹配不到呢?你就得从参数值里找原因了。
比如可能我请求的URL是这样的 api/2020.9.10/mobile_2
抱歉你永远也调整不成功,但是如果是这样的url : api/2020_9_10/mobile_2
恭喜你可以正常解析。 看到了吗?这种路由参数中不能有这个“.”,否则就会引发问题。
3、一些稍微灵活的定义可参考如下:
//自定义路由3
config.Routes.MapHttpRoute(
name: "sensorApi",
routeTemplate: "api/sensor/{name}",
defaults: new {controller= "upgrade", action= "sensor",name=RouteParameter.Optional}
);
4、类(方法)属性标签
如果想使用[Route("api/cache/list")] 这样重定义方法名,或者给控制器添加前缀 像这样:[RoutePrefix("test/categories")],或者像这样限制路由参数约束时 [Route("detail/{id:int:min(1)}/")]
则程序启动时必须包含以下代码:
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
以上就是我使用的总结,欢迎指正共同提高。
推荐文章:
MVC WebApi 在控制器“”上找不到与该请求匹配的操作
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力