开发者社区> 技术小胖子> 正文

WebApi - 路由

简介:
+关注继续查看

 使用vs创建webapi项目及项目结构介绍

首先,鼠标右键解决方案=》添加=》新建项目=》选择"Asp.net web应用程序"=》输入项目的名称,我这里是Stage.Api=》点击确定按钮,效果如:

然后会弹出一个界面,里面有三种模板选择,这里简单介绍下;

1. 选择"Empty模板"=》勾选"Web Api",如果不需要测试的话即可点击"确定"按钮就行了,然后解决方案中会生成一个很空的api项目,这里简单截图下选择的界面图:

 

2. 选择“MVC”=》勾选“Web API”=》点击“确定”,这个界面可以更改身份验证,如图:

 

3. 选择“Web API”=》直接点击“确定”(这里始终是选择mvc+webapi,其实就是上面的选择项),这里就不再截图了各位一尝试点击下试试;

我这里就选择webapi来创建项目,目录结构和说明如:

因为前面创建项目时候勾选了“MVC”与“Web API”,所以这个项目中包括了两者的初始文件,由目录结构能看出mvc和webapi相识度很高,除了试图外几乎能认可一样,当然具体代码还是有差别的,下面我们就开始来初步了解下webapi的routing吧;

 

. 默认路由模板介绍

首先,这里只说webapi的默认路由,来看App_Start/WebApiConfig.cs文件中默认路由类代码如下:

 1 public static class WebApiConfig 2     { 3         public static void Register(HttpConfiguration config) 4         { 5             // Web API configuration and services 6  7             // Web API routes 8             config.MapHttpAttributeRoutes(); 9 10             config.Routes.MapHttpRoute(11                 name: "DefaultApi",12                 routeTemplate: "api/{controller}/{id}",13                 defaults: new { id = RouteParameter.Optional }14             );15         }16     }

这个 Register 方法传递的参数 HttpConfiguration 类型;然后 config.MapHttpAttributeRoutes(); 主要功能是:允许项目框架可以使用属性标记来扩展路由; config.Routes.MapHttpRoute 对应有四个扩展方法,代码如:

 1 // 2         // 摘要: 
 3         //     映射指定的路由模板。 4         // 5         // 参数: 
 6         //   routes: 7         //     应用程序的路由的集合。 8         // 9         //   name:10         //     要映射的路由的名称。11         //12         //   routeTemplate:13         //     路由的路由模板。14         //15         // 返回结果: 
16         //     对映射路由的引用。17         public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate);18         //19         // 摘要: 
20         //     映射指定的路由模板并设置默认路由值。21         //22         // 参数: 
23         //   routes:24         //     应用程序的路由的集合。25         //26         //   name:27         //     要映射的路由的名称。28         //29         //   routeTemplate:30         //     路由的路由模板。31         //32         //   defaults:33         //     一个包含默认路由值的对象。34         //35         // 返回结果: 
36         //     对映射路由的引用。37         public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults);38         //39         // 摘要: 
40         //     映射指定的路由模板并设置默认路由值和约束。41         //42         // 参数: 
43         //   routes:44         //     应用程序的路由的集合。45         //46         //   name:47         //     要映射的路由的名称。48         //49         //   routeTemplate:50         //     路由的路由模板。51         //52         //   defaults:53         //     一个包含默认路由值的对象。54         //55         //   constraints:56         //     一组表达式,用于限制 routeTemplate 的值。57         //58         // 返回结果: 
59         //     对映射路由的引用。60         public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints);61         //62         // 摘要: 
63         //     映射指定的路由模板并设置默认的路由值、约束和终结点消息处理程序。64         //65         // 参数: 
66         //   routes:67         //     应用程序的路由的集合。68         //69         //   name:70         //     要映射的路由的名称。71         //72         //   routeTemplate:73         //     路由的路由模板。74         //75         //   defaults:76         //     一个包含默认路由值的对象。77         //78         //   constraints:79         //     一组表达式,用于限制 routeTemplate 的值。80         //81         //   handler:82         //     请求将被调度到的处理程序。83         //84         // 返回结果: 
85         //     对映射路由的引用。86         public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler);

具体的参数说明已经备注好了,通过备注我们简单总结下name:某类模板的唯一名称,routeTemplate:路由模板,defaults:默认参数;我们自动生成的默认模板格式如: api/{controller}/{id} ,由经验得出这里的Controller指的就是我们在Controllers文件夹中创建的apiController的名称,id对应的是参数,这里有默认值 RouteParameter.Optional 表示id参数可选传递;好了通过参数的分析讲解说明,咋们来在浏览器中访问下我们自动生成的模板地址,看能得到什么数据,我这里是通过iis指向了我这个webapi项目,访问的地址如: http://localhost:1001/api/values ,这个时候会出现一个错误:

不要慌张,这个所由于我们初建项目,没有生成造成的(这里简单描述下网站和项目的最大使用区别,1.网站如果是更新了web页面的代码,不需要重新生成 2.如果是项目的话修改了代码必须要重新生成,不然发布没有任何效果),好咋们生成后,重新在浏览器中访问上面的地址,得到如下结果:

再来看一下对应的代码文件 Controllers/ValuesController.cs ,然后代码如:

1  // GET api/values2         public IEnumerable<string> Get()3         {4             return new string[] { "value1", "value2" };5         }

我们得到的结果就是这段代码执行出来的数据;

 

. 属性路由标记的使用

这里先来说下,webapi常用到的允许访问方式的标记有GET,POST,PUT,DELETE等,有朋友立马就反应过来这几乎和MVC试图中的设置差不多呢,是的就是这样;然后再来了解下路由标记Route的使用,先来看一段代码:

1 // GET api/values2         [Route("webapi")]3         public IEnumerable<string> Get()4         {5             return new string[] { "value1", "value2" };6         }

仔细的朋友能够发现这里就是上面我们直接访问 http://localhost:1001/api/values 地址的测试代码,现在我们增加了标记 [Route("webapi")] 有什么作用呢,咋们先来生成下项目,然后再访问之前使用的地址 http://localhost:1001/api/values 得到的结果如:

此时我们无法正常得到刚才的文字结果,这是因为Route标记吧路由地址改为 http://localhost:1001/webapi 这样直接访问action的方法,好咋们使用该地址在浏览器得出结果如下:

和加Route之前得到的结果是一样的,由此我们得到Route标记有改变路由地址的功能,下面我们来看下Route类代码:

 1 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 2     public sealed class RouteAttribute : Attribute, IHttpRouteInfoProvider 3     { 4         public RouteAttribute(); 5         public RouteAttribute(string template); 6  7         public string Name { get; set; } 8         public int Order { get; set; } 9         public string Template { get; }10     }

由上可知我们刚才使用到了 RouteAttribute(string template) 构造函数来传递对应的参数,看代码中Order,Name两个属性,这个可能会在今后讲解中使用到,以后再说;下面我们再来看RoutePrefix及她的一段代码相关代码:

1 [RoutePrefix("v")]2     public class ValuesController : ApiController

再来访问我们刚才的地址: http://localhost:1001/webapi ,此时得到的错误信息“无法找到资源。”,那我们再来改变下路径如: http://localhost:1001/v/webapi ,能正常得到结果:

由此RoutePrefix的效果,体现出来了,如果这是了该标记,就需要我们访问api地址时,需要加上对应的v才行,这个对应的代码是:

1 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]2     public sealed class RoutePrefixAttribute : Attribute3     {4         public RoutePrefixAttribute(string prefix);5 6         public string Prefix { get; }7     }

      本文转自zsdnr  51CTO博客,原文链接:http://blog.51cto.com/12942149/1928944,如需转载请自行联系原作者







版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
WebApi - 路由
这段时间的博客打算和大家一起分享下webapi的使用和心得,主要原因是群里面有朋友说希望能有这方面的文章分享,随便自己也再回顾下;后面将会和大家分不同篇章来分享交流心得,希望各位多多扫码支持和点赞,谢谢,希望大家喜欢:   .
1017 0
WebApi-控制器路由
WebAPI核心任务是什么?它的核心机制又是什么?
69 0
[SignalR]配置路由
原文:[SignalR]配置路由 注册路由,在代码如下(SignalR 1.*): 脚本修改如下: 但是其官方文档解释是: By default, the route URL which clients will use to connect to your Hub is "/signalr".
902 0
2.C#WebAPI设置路由和参数1
1.当我们创建WebApi的时候我们的项目下的Contorls文件夹下的ValuesController文件下会出现这么几个方法: // GET http://程序ip:程序端口/api/values public IEnumerable Get() { ...
1425 0
3.C#WebAPI设置路由和参数2
1.上面已经教大家如何修改全局路由了,那么修改完后我们在post请求的要这样使用,其中model模型我就默认你应该已经建好了,没有创建的话请看上一部分 Post方法的参数,如果提交的请求体需要是phoneNum=123&password=123这样的格式。
1471 0
[SignalR]注册路由
原文:[SignalR]注册路由 1.注册SignalR路由 在Asp.Net中,若是SignalR 1.*版本,在Global.asax文件中定义如下: 在Asp.Net中,若是SignalR 2.
667 0
【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--自动路由篇(1/8)【route】
文章目录 前情概要 在使用express框架开发的时候,每加一个请求,都在增加一条route请求规则,类似于下面的代码,很烦有木有! app.use('/myroute path', (req, res, next) => { //dosomething }) 我们难道不能再智能一点点么,学习后端mvc框架一样,比如加个标记,或者默认规则直接自动映射嘛。
991 0
【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--路由限制及选择篇(2/8)【route】
文章目录 前情概要 上文中的RouteHandler中有一个重要方法GetActionDescriptor没有贴代码和说,接下来我们就说一说这个方法。 使用controllerName、actionName、httpmethod获得唯一匹配的处理函数描述对象 直接上代码,看代码注释即可 //acti...
850 0
[转发]MVC WebAPI get和post请求
转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理。 这里我使用Jquery 来发起异步请求实现数据调用。
1179 0
+关注
技术小胖子
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载