سیستم مسیریابی در WebAPI
سه شنبه 13 مرداد 1394در WebAPI تمام درخواستهای http تحت سیستم مسیریابی (Routing System) است که مدیریت درخواستها را تصمیم گیری می نماید. هدف اصلی از سیستم مسیریابی برای تصمیم گیری و پاسخ به این سوال می باشد : چه متدی از کدام کنترل بهتر است تا آن درخواست را انجام دهد؟
هنگامی که ما یک برنامه ساده از نوع WebAPI ایجاد می کنیم template مانند زیر به صورت خودکار یک Route (مسیر) پیش فرض برای ما تولید می کند :
namespace route_routeprifx { public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); } } }
متد config.Routes.MapHttpRoute شامل 3 پارامتر زیر می باشد :
1- نام مسیر ("DefaultApi")
2- مسیر Template : یک Template همراه با API و 2 placeholder (کنترلر و id)
3-مقدار پیش فرض : در این مورد، Id در درخواست اجباری نمی باشد.
اگر شما از MVC استفاده می کنید شما شباهت های زیادی پیدا خواهید کرد. در MVC یک متد برای قالب مسیریابی وجود دارد اما در اینجا این متد موجود نیست. این تفاوت اصلی میان 2 سیستم مسیر یابی در WebAPI است.
الگوی پیش فرض مسیریابی در یک پروژه MVC یه صورت زیر تعریف می شود :
routes.MapRoute( name: "Default", //route name url: "{controller}/{action}/{id}", //route pattern defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional} //parameter default values );
اگر سیستم مسیریابی یک مسیر متناسب با الگوی خود پیدا نکند HTTP 404 برمی گرداند.
برای آنکه تصمیم بگیرد کدام متد صدا زده شود سیسم مسیر یابی باید متد HTTP را آنالیز نماید. اگر ما یک درخواست GET در سرور داشته باشیم اکشن باید چیزی شبیه ()GetResource باشد. اما اگر Post باشد اکشن باید ()PostResource باشد
هنگامی که مسیرها را تغییر می دهیم یا مسیر جدیدی در برنامه اضافه می کنیم :
amespace routwork { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services // Configure Web API to use only bearer token authentication. config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); config.Routes.MapHttpRoute( name: "GetAllEmploye", routeTemplate: "api/values/GetAll", defaults: new { controller = "Values", action = "GetAll", id = UrlParameter.Optional } ); config.Routes.MapHttpRoute( name: "Getdetail", routeTemplate: "api/values/Getdetail/{id}", defaults: new { controller = "Values", action = "Getdetail", id = UrlParameter.Optional } ); config.Routes.MapHttpRoute( name: "GetEmployeDetailByTest", routeTemplate: "api/values/GetEmployeDetailByTest/{id}", defaults: new { controller = "Values", action = "GetEmployeDetailByTest", id = UrlParameter.Optional } ); } } }
در اینجا 3 نام مسیر جدید از همه مسیر های جدید داریم. آنها یکی نیستند و همه Template مسیرها شامل PlaceHolder های متنوع هستند و در همه مسیر ها id اختیاری است.
برای مثال زیر یک کنترلر با نام ValuesController اضافه شده است.
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using routwork.Models; namespace routwork.Controllers { public class ValuesController : ApiController { // GET api/values [HttpGet] [ActionName("GetAll")] public List<Employe> GetAllEmploye() { List<Employe> emplist = new List<Employe>(); emplist.Add(new Employe { Empid = 1, Empname = "atul", }); emplist.Add(new Employe { Empid = 2, Empname = "taj", }); return emplist; } [ActionName ("Getdetail")] public Employe GetEmployeDetail(int id) { return new Employe { Empid = 1, Empname = "atul" }; } public Employe GetEmployeDetailByTest(int id) { return new Employe { Empid = 2, Empname = "taj" }; } } }
حال خروجی های بدست آمده از url های بالا را مشاهده می کنیم :
1- api/values/GetAll :
2- api/values/Getdetail/1 :
3- api/values/GetEmployeDetailByTest/2 :
در بالا همه فراخوانی ها از نوع Get هستند. اگر Post بودند با خطاهای زیر مواجه می شدیم :
HttpGet
HttpPost
HttpPut
HttpOptions
HttpPatch
HttpDelete
HttpHead
نتیجه گیری
در این مقاله نحوه مسیردهی در WebAPI و همچنین تفاوت های موجود در مسیردهی بین MVC و WebAPI را بررسی کردیم.
- ASP.net MVC
- 2k بازدید
- 1 تشکر