2016-11-10 23 views
6

Câu hỏi liên quan đến việc xác định các tuyến tùy chỉnh với thuộc tính Route.Định tuyến Web API 2 - Thuộc tính tuyến

Tôi biết rằng trong lớp WebApiConfig bạn luôn xác định tuyến đường mặc định,

configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional }); 

Những gì tôi không thể có được làm việc là khi tôi muốn vượt qua tham số khác. Tôi biết tôi có thể làm được điều này (mã dưới đây được định nghĩa bên dưới tuyến đường mặc định liệt kê ở trên):

//configuration.Routes.MapHttpRoute(
    // name: "GetBrandImagePaths", 
    // routeTemplate: "api/{controller}/{id}/{type}"); 

Nhưng tôi thà, thay vì xác định tất cả các đường bay trong file WebApiConfig, sử dụng định tuyến tùy chỉnh. Tuy nhiên, nếu tôi không có mã nhận xét ở trên trong tệp, tôi nhận được 404. Có dẫn tôi tin rằng tùy chỉnh Route thậm chí không được xem xét.

public class HelperApiController : ApiController 
{ 
    [HttpGet] 
    [Route("api/helperapi/{id}/{type}")] 
    public string GetBrandImages(int id, string type) 
    { 
     ..... 
    } 
} 

Làm cách nào để có thể sử dụng tuyến đường được xác định trong tệp WebApiConfig và định tuyến tùy chỉnh trong bộ điều khiển API riêng lẻ.

Lưu ý rằng dự án này cũng là một dự án MVC (không chỉ WebApi). Có cái gì tôi đang mất tích, làm không chính xác, vv? Tôi biết có rất nhiều bài viết ra có xác định làm thế nào để vượt qua nhiều params, nhưng tôi nghĩ rằng câu hỏi của tôi là một chút cụ thể hơn về lý do tại sao một công trình và không phải là khác.

Trả lời

13

Bạn cần gọi số config.MapHttpAttributeRoutes().

Điều này sẽ phân tích tất cả các lớp Controller và lấy được các tuyến từ thuộc tính.

Tôi sẽ không kết hợp điều này với định tuyến chuẩn.

+0

Vì vậy, nếu tôi thêm cuộc gọi đó, điều đó có gây rối các tuyến đường mặc định khác không? (kết quả hành động, vv)? Có thể nói rằng sử dụng 'config.MapHttpAttrubteRoutes()' chỉ dành cho các dự án WebApi thẳng không? –

+0

Không, nó không ghi đè lên bất kỳ tuyến đường nào bạn đặt theo cách thủ công. Tuy nhiên, đừng trang trí các lớp 'Controller' đó với bất kỳ thuộc tính định tuyến nào nếu không bạn sẽ nhận được các tuyến trùng lặp và có khả năng xung đột. Tôi đã từng sử dụng các thuộc tính định tuyến cho các dự án WebApi nên không thể bình luận về sự phù hợp của chúng với MVC. – toadflakz

+0

Vì vậy, nếu tôi không trang trí bất kỳ bộ điều khiển khác (không Api) w/'Route' hoặc' RoutePrefix' sau đó họ vẫn sẽ tuyến đường đến các thiết bị đầu cuối chính xác? –

5

Attribute Routing in ASP.NET Web API 2

Kích hoạt thuộc tính Routing

Để kích hoạt định tuyến thuộc tính, gọi MapHttpAttributeRoutes trong cấu hình. Phương pháp mở rộng này được xác định trong các lớp học System.Web.Http.HttpConfigurationExtensions.

using System.Web.Http; 

namespace WebApplication 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      // Other Web API configuration not shown. 
     } 
    } 
} 

Định tuyến thuộc tính có thể được kết hợp với định tuyến dựa trên quy ước. Để xác định các tuyến dựa trên quy ước, hãy gọi phương thức MapHttpRoute.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 
Các vấn đề liên quan