这段时间的博客打算和你们一块儿分享下webapi的使用和心得,主要缘由是群里面有朋友说但愿能有这方面的文章分享,随便本身也再回顾下;后面将会和你们分不一样篇章来分享交流心得,但愿各位多多扫码支持和点赞,谢谢,但愿你们喜欢:web
. 使用vs建立webapi项目及项目结构介绍api
. 默认路由模板介绍浏览器
. 属性路由标记的使用mvc
下面一步一个脚印的来分享:框架
. 使用vs建立webapi项目及项目结构介绍ide
首先,鼠标右键解决方案=》添加=》新建项目=》选择"Asp.net web应用程序"=》输入项目的名称,我这里是Stage.Api=》点击肯定按钮,效果如:函数
而后会弹出一个界面,里面有三种模板选择,这里简单介绍下;测试
1. 选择"Empty模板"=》勾选"Web Api",若是不须要测试的话便可点击"肯定"按钮就好了,而后解决方案中会生成一个很空的api项目,这里简单截图下选择的界面图:网站
2. 选择“MVC”=》勾选“Web API”=》点击“肯定”,这个界面能够更改身份验证,如图:this
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/values 2 public IEnumerable<string> Get() 3 { 4 return new string[] { "value1", "value2" }; 5 }
咱们获得的结果就是这段代码执行出来的数据;
. 属性路由标记的使用
这里先来讲下,webapi经常使用到的容许访问方式的标记有GET,POST,PUT,DELETE等,有朋友立马就反应过来这几乎和MVC试图中的设置差很少呢,是的就是这样;而后再来了解下路由标记Route的使用,先来看一段代码:
1 // GET api/values 2 [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 : Attribute 3 { 4 public RoutePrefixAttribute(string prefix); 5 6 public string Prefix { get; } 7 }
好了,本篇就到这里了,主要是电脑没电了,下次继续分享webapi文章,但愿各位多多支持,勿喷。