亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用ASP.NET Web Api構建基于REST風格的服務實戰系列教程【外傳】——Attribute Routing

2019-11-17 01:25:29
字體:
來源:轉載
供稿:網友

使用asp.net Web Api構建基于REST風格的服務實戰系列教程【外傳】——Attribute Routing

系列導航地址http://www.49028c.com/fzrain/p/3490137.html

題外話:由于這個技術點是新學的,并不屬于原系列,但借助了原系列的項目背景,故命名外傳系列,以后也可能在這個系列中附加一些新的技術。

前言

在Web Api 2.0中,提出了一種新的配置路由方式——基于特性的路由(Attribute-based Routing),在我們之前介紹的配置路由方式稱為——基于公約的路由(Convention-based Routing),新的路由配置方式同樣應用在MVC5中,因此本文就來介紹一下基于特性的路由。

在之前的一篇文章中,我們處理了這么一個業務——實現學生選課。我們是通過在“WebApiConfig”定制了一條路由數據來實現的,這條路由實現了選課以及根據課程Id來查詢選擇選擇該課程的所有學生信息,感覺設計還可以。在實際應用中一般來說查詢用的是最多的,使用Attribute Routing來注冊路由會更靈活,控制起來也更方便,更符合Rest。本文以根據課程的名字來查詢所有選擇該課程的學生信息以及根據課程名字以及學生名字查詢某一學生的信息。

基于特性的路由介紹

顧名思義,新路由將使用一個特性來實現路由注冊,如下:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple=true, Inherited=true)]    public sealed class RouteAttribute : Attribute, IHttPRouteInfoProvider    {        public RouteAttribute();        public RouteAttribute(string template);            public string  Name { get; set; }        public int     Order { get; set; }        public string  Template { get; private set; }    }

這個類包含3個屬性:Name指路由的名字,Order是指路由的順序,Template就是我們要去匹配URL的模板

實現Attribute Routing

原理性的東西不多介紹的(我也沒多研究 呵呵),能把學到的技術運用到實際中才是王道,上來一大堆原理容易暈,以后需要深入研究再看原理。

在“EnrollmentsController”中新增一個方法GetStudentsInfo:

[Route("api/enrollments/{courseName}/{studentName?}")]        public IEnumerable<StudentBaseModel> GetStudentsInfo(string courseName, string studentName="")        {            IQueryable<Student> query;            Course course=  TheRepository.GetAllCourses().Where(c => c.Name == courseName).FirstOrDefault();            if (course==null )            {                return null ;            }             query = TheRepository.GetEnrolledStudentsInCourse(course.Id).OrderBy(s => s.LastName);            if (!string.IsNullOrWhiteSpace(studentName))            {                query = query.Where(s => s.FirstName == studentName);            }            var totalCount = query.Count();            System.Web.HttpContext.Current.Response.Headers.Add("X-InlineCount", totalCount.ToString());            var results = query                        .ToList()                        .Select(s => TheModelFactory.Create(s));            return results;        }

在我們的Action上使用了RouteAttribute。分析一下這個URL模板("api/enrollments/{courseName}/{studentName?}"),{courseName}會匹配到Action的courseName參數上,對于Action的另一個參數studentName是一個可選參數,也就是說請求中沒有給出值那么就是默認的空字符串,有值得話就會被賦值,因此我們在“{studentName}”后面加上? 標記為可選的URI參數。

ok,就這么簡單,測試一次:

image

結果:

image

呃,出錯了。。。

一個新的問題

出錯了,不過不管怎么說解決方案總歸是有的,首先看下錯誤原因:是在LearningControllerSelector類的方法中出現了空引用,那么我們就不得不看下這個方法:

public override HttpControllerDescriptor SelectController(HttpRequestMessage request)        {            var controllers = GetControllerMapping(); //Will ignore any controls in same name even if they are in different namepsace             var routeData = request.GetRouteData();             var controllerName = routeData.Values["controller"].ToString();             HttpControllerDescriptor controllerDescriptor;             if (controllers.TryGetValue(controllerName, out controllerDescriptor))            {                 var version = "2";                 var versionedControllerName = string.Concat(controllerName, "V", version);                 HttpControllerDescriptor versionedControllerDescriptor;                if (controllers.TryGetValue(versionedControllerName, out versionedControllerDescriptor))                {                    return versionedControllerDescriptor;                }                 return controllerDescriptor;            }             return null;         }

看了這段代碼我們不難發現這個方法是我們重寫了基類的方法,目的是為了實現現版本控制(詳情可移步:http://www.49028c.com/fzrain/p/3558765.html),在我們重寫的方法中我們用到了RouteData中包含的Controller的名字,而這個名字是由基于公約的路由與URI匹配得到的,因此我們這里肯定是沒有的。因為我們的項目混合了2鐘路由配置,而自定義的方法是針對基于公約的路由配置,因此對于Attribute Routing我們直接使用默認的選擇方式:

在“var controllerName = routeData.Values["controller"].ToString(); ”代碼之前加一個判斷:

if (string.IsNullOrWhiteSpace(routeData.Route.RouteTemplate))            {               return   base.SelectController(request);            }

再次請求就會得到如下結果:

image

結果正確,解決方案感覺還可以再考慮考慮,大家有什么好的建議可以提。但是不管怎么說,有一點是明確的:對于基于特性的路由規則,不需要包含Controller的名字,在本案列中感覺上是尋找Acton上的路由模板來匹配請求的URI,然后確定對應的Action。

總結

基于特性路由(Attribute Routing)是一種新的定制路由規則方式,與傳統的配置方式相比更靈活,但同時比較分散,在web api中,2鐘路由配置方式可以共存,所以本文只是介紹一種新的配置方式,做項目時也可以多一種選擇。

本文參考相關鏈接:http://www.49028c.com/aehyok/p/3449851.html

http://www.49028c.com/artech/p/attribute-routing-01.html

源碼地址:https://github.com/fzrain/WebApi.eLearning


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99热精品这里久久精品| 国产成人欧美在线观看| 国产精品夜色7777狼人| 国产999在线| 亚洲色图50p| 中文字幕欧美精品日韩中文字幕| 精品无人国产偷自产在线| 91牛牛免费视频| 国产一区红桃视频| 国产精品第1页| 日本最新高清不卡中文字幕| 91亚洲精品在线| 欧美日韩亚洲视频| 成人444kkkk在线观看| 国产91成人在在线播放| 欧美激情精品久久久久久变态| 久久久久久一区二区三区| 美女视频黄免费的亚洲男人天堂| 亚洲第一福利网站| 国产精品jvid在线观看蜜臀| 81精品国产乱码久久久久久| 午夜精品一区二区三区视频免费看| 久久免费少妇高潮久久精品99| 日本欧美在线视频| 一本色道久久综合狠狠躁篇怎么玩| 亚洲女性裸体视频| 97涩涩爰在线观看亚洲| 色综合久综合久久综合久鬼88| 久久久久国产精品免费网站| 亚洲在线观看视频| 久久久久久久香蕉网| 中文字幕亚洲一区二区三区| 精品久久久一区| 国产精品扒开腿做爽爽爽男男| 91沈先生作品| 91在线观看免费网站| 欧美激情视频一区二区三区不卡| 欧美激情视频在线观看| 亚洲毛片在线观看.| 国产成人综合精品| 55夜色66夜色国产精品视频| 国产+成+人+亚洲欧洲| 亚洲精品久久视频| 性金发美女69hd大尺寸| 亚洲精品国产欧美| 国内精品久久久久久| 日韩在线欧美在线| 日韩av理论片| 日本精品在线视频| 在线精品播放av| 久久99精品视频一区97| 精品国产欧美一区二区三区成人| 久久天天躁狠狠躁老女人| 亚洲图片欧美午夜| 亚洲高清免费观看高清完整版| 亚洲美女在线观看| 91久热免费在线视频| 亚洲欧美第一页| 中文字幕亚洲欧美日韩在线不卡| 在线看福利67194| 欧美日韩国产精品一区二区三区四区| 国语自产精品视频在线看一大j8| 国产成人精品亚洲精品| 成人情趣片在线观看免费| 日韩欧美综合在线视频| 成人免费看吃奶视频网站| 欧美一二三视频| 亚洲精品v欧美精品v日韩精品| 欧美自拍视频在线观看| 91久久国产精品| 91色视频在线导航| 精品中文字幕在线2019| 精品无人区乱码1区2区3区在线| 成人性生交大片免费观看嘿嘿视频| 久久高清视频免费| 亚洲r级在线观看| 在线观看国产成人av片| 亚洲aa中文字幕| 久久网福利资源网站| 色青青草原桃花久久综合| 欧美体内谢she精2性欧美| 亚洲qvod图片区电影| 亚洲精品成人久久| 九九精品在线播放| 亚洲精品一区二区在线| 九九热视频这里只有精品| 91欧美日韩一区| 51久久精品夜色国产麻豆| 精品久久在线播放| 欧美午夜美女看片| 欧美老肥婆性猛交视频| 中文在线资源观看视频网站免费不卡| 911国产网站尤物在线观看| 久久久噜噜噜久噜久久| 久久久伊人欧美| 欧美性jizz18性欧美| 亚洲一区二区三区毛片| 亚洲人成网站777色婷婷| 国产ts人妖一区二区三区| 狠狠躁18三区二区一区| 亚洲老头老太hd| 亚洲天堂av在线播放| 国产suv精品一区二区三区88区| 丝袜亚洲欧美日韩综合| 久久精品视频va| 久久亚洲精品一区二区| 国产一区二区三区在线视频| 亚洲自拍欧美色图| 精品久久久久久久久久久久久久| 欧美片一区二区三区| 成人免费视频xnxx.com| 亚洲香蕉伊综合在人在线视看| 97超级碰在线看视频免费在线看| 欧美日韩爱爱视频| 欧美国产激情18| 亚洲一区二区中文字幕| 欧美日韩国产色视频| 国产精品青草久久久久福利99| 另类少妇人与禽zozz0性伦| 久久婷婷国产麻豆91天堂| 久久精品视频网站| 91九色国产视频| 亚洲乱码一区二区| 98午夜经典影视| 91人成网站www| 成人免费视频a| 中文国产成人精品| 91性高湖久久久久久久久_久久99| 日韩在线观看免费全集电视剧网站| 亚洲成avwww人| 成人久久久久久久| 亚洲最大的免费| 国产精品久久久久久久久久东京| 欧美在线视频观看免费网站| 亚洲免费av网址| 日韩在线免费视频| 亚洲美女av网站| 亚洲jizzjizz日本少妇| 精品国产网站地址| 中文字幕精品在线视频| 亚洲人成在线观看| 国产精品专区h在线观看| 97视频在线观看成人| 国产一区二区三区视频在线观看| 欧美有码在线观看视频| 2019亚洲日韩新视频| 国产美女主播一区| 久久99精品久久久久久青青91| 一本色道久久88综合日韩精品| 国产精品成人av在线| 北条麻妃一区二区在线观看| 国产一区二区激情| 欧美一级大胆视频| 国产欧美最新羞羞视频在线观看| 欧美在线性爱视频| 亚洲成人国产精品| 日韩暖暖在线视频| 久久成人精品电影| 欧美在线观看网址综合| 国内精品中文字幕| 久久久精品一区二区| 亚洲成年人在线播放| 国产日韩精品视频| 欲色天天网综合久久|