ASP.NET маршрутизація Web API, простіше кажучи, — це процес відображення запитів клієнта на відповідні дії. У статті «ASP.NET Web API Practice Series 03, Routing Templates, Routing Conventions, Routing Settings» я познайомився з налаштуванням маршрутів через шаблони, конвенції та HTTP-методи, і перевага цього підходу полягає в тому, що шаблони маршрутизації рівномірно розміщені в класі WebApiConfig у папці App_Start, що зручно для управління, але недоліком є недостатня гнучкість.
REST розглядає все як ресурс, і іноді ресурс із дочірніми ресурсами, такі як Customer і Orders, може захотіти ввести запит на кшталт customers/1/orders, але це важко зробити лише за традицією. Насправді, ASP.NET Web API надає нам функцію Route, яку можна безпосередньо підключити до Action, і вона дуже гнучка та інтуїтивно зрозуміла у використанні.
Давайте спробуємо, як користуватися функцією Route у ASP.NET MVC4.
Дозволити атрибут Route
Спочатку потрібно налаштувати це у WebApiConfig.
Наведений вище метод MapHttpAttributeRoutes доступний лише в новіших версіях ASP.NET Web APIЯкщо ваша версія відносно низька, ви можете видалити стару версію і встановити останню через консоль NuGet Package Manager.
Далі, у Global.asax, потрібно прокоментувати оригінальний спосіб реєстрації WebApiConfig і застосувати новий метод, а саме:
На цьому етапі запуск проєкту може повідомити про таку помилку:
Це тому, що при завантаженні останньої версії ASP.NET Web API я також завантажив останню версію icrosoft. AspNet.WebApi.HelpPage。 Ви можете видалити останню версію HelpPage і завантажити старішу версію.
Uninstall-Package Microsoft.AspNet.WebApi.HelpPage –Force Install-Package Microsoft.AspNet.WebApi.HelpPage -pre
Використати властивість Route
Створіть клас Кусомтера.
Створіть клас Order.
Створіть клас бази даних, щоб отримати колекцію Order.
Створіть порожній контролер API, написаний так:
Введіть у браузері наступне:
Якщо ви використовуєте ASP.NET MVC4 для розробки, ви можете отримати таку помилку при першому запуску програми:
[A] System.Web.WebPages.Razor.Configuration.HostSection не може бути транслюватися на [B]System.Web.WebPages.Razor.Configuration.HostSection. Тип A походить від "System.Web.WebPages.Razor, version=2.0.0.0, culture=neutral, PublicKeyToken=31bf3856ad364e35" (у "C:/Windows/Microsoft.Net/assembly/GAC_MSIL/ у контексті "Default") System.WebPages.Razor/v4.0_2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll"). Тип B походить від "System.Web.WebPages.Razor, version=3.0.0.0, culture=neutral, PublicKeyToken=31bf3856ad364e35" (у контексті "Default" у "C:/Windows/Microsoft.NET/Framework/v4.0.30319/ Тимчасові ASP.NET файли/vs/feb7ce97/a525d58a/asse
Це пов'язано з тим, що остання версія Razor використовується при завантаженні останньої версії ASP.NET Web API. Вам потрібно налаштувати наступну конфігурацію в кореневому каталозі Web.config:
Використовуйте функцію RoutePrefix
Якщо хочете додати всі Actions у API-контролер, можна встановити функцію RoutePrefix на контролер API.
Наприклад, ми хочемо, щоб це було у такому форматі: http://localhost/api/customers/1/orders
Модифікувати OrdersController таким чином.
Ви також можете використовувати ~ у функції Маршрут, щоб перезаписати префіксні правила Дії.
Префікс, визначений ознакою RoutePrefix, також може містити змінні параметрів:
Обмеження маршрутизації
Ви можете обмежити змінні параметрів у маршруті за допомогою «{ім'я змінної параметра: обмеження}».
Вище, якщо id змінної фрагмента є типом int, вона маршрутизується до першої дії, а якщо ні — до другої дії.
ASP.NET Вбудовані обмеження Web API включають:
{x:alpha} обмежує великі та малі літери {x:bool} {x:datetime} {x:decimal} {x:double} {x:float} {x:guid} {x:int} {x:довжина(6)} {x:length(1,20)} обмежує діапазон довжин {x:long} {x:maxlength(10)} {x:min(10)} {x:range(10,50)} {x:regex(regex)}
Ви можете одночасно встановити кілька обмежень для змінної параметра:
Реалізуйте інтерфейс IHttpRouteConstraint для налаштування правил обмежень. Реалізуйте обмеження, яке не може бути 0.
Зареєструйте власне обмеження у WebApiConfig у папці App_Start.
Використовуйте власні обмеження.
Опціональні параметри та їхні значення за замовчуванням
Якщо змінна параметра маршрутизації є необов'язковою, параметру також потрібно надати значення за замовчуванням.
Додати ? після обмеження вказати опціонально, і встановити значення за замовчуванням id у параметрах методу.
Встановіть назву маршруту
Пріоритет маршрутизації
Пріоритет маршруту, встановлений властивістю Route, визначається на основі конвенцій та властивості RouteOrder.
Конвенції такі:
1. Статичні фрагментні змінні 2. Фрагментні змінні з обмеженнями 3. Фрагментні змінні без обмежень 4. Змінна фрагмента дикого карти з обмеженнями 5. Необмежені змінні wildcard фрагментів
Значення за замовчуванням властивості RouteOrder дорівнює 0, і чим менше значення властивості, тим воно вище.
Вище наведено порядок пріоритету для маршрутизації:
змінна статичного фрагмента orders/details, значення властивості RouteOrder дорівнює 0 orders/{id} з обмеженими фрагментними змінними зі значенням 0 у властивості RouteOrder orders/{customerName} — це фрагментна змінна без обмежень, а значення властивості RouteOrder дорівнює 0 orders/{*date} — це wildcard fragment змінна зі значенням 0 у властивості RouteOrder замовлення/очікування властивості RouteOrder значення 1
|