2014-10-18 21 views
7

Tôi cần có bộ điều khiển có cùng tên trong không gian tên khác nhau. Các bộ điều khiển tôi đang gặp là:Bộ điều khiển có cùng tên trong không gian tên khác nhau ASP.NET WEB API

namespace BSB.Messages.Controllers.V1 
{  
    public class MessagesController : ApiController {...} 
} 

namespace BSB.Messages.Controllers.V2 
{  
    public class MessagesController : ApiController {...} 
} 

Tôi cố gắng để cấu hình nó trong đầu lên. Nhưng khi tôi thực hiện cuộc gọi, nó hiển thị lỗi:

Nhiều loại được tìm thấy khớp với bộ điều khiển có tên 'thông điệp'. Điều này có thể xảy ra nếu tuyến đường dịch vụ yêu cầu này ('api/{namespace}/{controller}/{action}/{id}') đã tìm thấy nhiều bộ điều khiển được xác định có cùng tên nhưng khác nhau về không gian tên, trong đó không được hỗ trợ

chức năng Đăng ký của tôi trong WebApiConfig là:

public static void Register(HttpConfiguration config) 
{ 
     config.MapHttpAttributeRoutes(); 
     config.Routes.MapHttpRoute("DefaultApi", "api/{namespace}/{controller}/{action}/{id}", new { id = UrlParameter.Optional }); 
} 

chức năng My RegisterRoutes là:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    var r = routes.MapRoute(
       name: "Default", 
       url: "v1/messages/{action}/{id}", 
       defaults: new { id = UrlParameter.Optional }, 
       namespaces: new[] { "BSB.Messages.Controllers.V1" } 

      ); 
    r.DataTokens["Namespaces"] = new string[] { "BSB.Messages.Controllers.V1" }; 

    var r1 = routes.MapRoute(
       name: "V2", 
       url: "v2/messages/{action}/{id}", 
       defaults: new { id = UrlParameter.Optional }, 
       namespaces: new[] { "BSB.Messages.Controllers.V2" } 
      ); 
    r1.DataTokens["Namespaces"] = new string[] { "BSB.Messages.Controllers.V2" }; 
} 

Tôi đã gọi cả hai chức năng từ Global.asax

Bất kỳ một thể giúp tôi trong việc này? Những gì tôi đã bỏ lỡ ở đây?

Cảm ơn,
Priya

+0

thử này 'var r1 = routes.MapRoute ( tên: "V2", url: "v2/tin nhắn/{action}/{id}", giá trị mặc định: mới {controller =" v2 ", id = UrlParameter.Optional}, không gian tên: new [] {" BSB.Messages.Controllers.V2 "} );' –

+0

Khuôn khổ rõ ràng nói rằng nó không được hỗ trợ. – Nkosi

Trả lời

1

Các "RegisterRoutes" Phương pháp thứ hai chỉ áp dụng cho MVC bộ điều khiển không điều khiển API. Định tuyến API nên được thực hiện trong quá trình khởi động WebAPI.

Dòng: config.MapHttpAttributeRoutes(); sẽ hoạt động tốt nhất cho bạn, nhưng sẽ vẫn yêu cầu bạn đổi tên các lớp điều khiển của bạn. Hãy xem ở đây để biết thêm về định tuyến thuộc tính: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

nào giải thích rằng bạn có thể trang trí lớp học của bạn với các thuộc tính xác định tuyến đường của bạn:

namespace BSB.Messages.Controllers.V1 
{ 
    [RoutePrefix("api/v1/messages")]  
    public class MessagesV1Controller : ApiController {...} 
} 

namespace BSB.Messages.Controllers.V2 
{  
    [RoutePrefix("api/v2/messages")] 
    public class MessagesV2Controller : ApiController {...} 
} 

Và trong khi khởi động WebAPI của bạn, bạn có thể hoặc là thoát khỏi MapHTTPRoute cuộc gọi và đi thuộc tính duy nhất, hoặc:

public static void Register(HttpConfiguration config) 
{ 
    config.MapHttpAttributeRoutes(); 
    config.Routes.MapHttpRoute("DefaultApi", "api/v1/messages/{action}/{id}", new { controller = "MessagesV1", id = UrlParameter.Optional }); 
    config.Routes.MapHttpRoute("DefaultApi", "api/v2/messages/{action}/{id}", new { controller = "MessagesV2", id = UrlParameter.Optional }); 
    config.Routes.MapHttpRoute("DefaultApi", "api/{namespace}/{controller}/{action}/{id}", new { id = UrlParameter.Optional }); 
} 

ở trên sẽ cho kết quả trong các tuyến đường làm việc tiếp theo:

Hy vọng rằng sẽ giúp!

Steve

+0

Tôi thấy điều này không hoạt động BTW – Yorro

+1

Đọc lại và sửa lỗi/cải thiện câu trả lời. Cảm ơn! – Steve

Các vấn đề liên quan