2014-10-18 167 views
7

我需要在不同名稱空間中具有相同名稱的控制器。 時遇到的控制器:具有不同名稱空間的相同名稱的控制器ASP.NET WEB API

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

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

我試圖將其配置在啓動時。但仍然當我撥打電話時顯示錯誤:

發現多個類型與名爲'messages'的控制器相匹配。如果爲請求 ('api/{namespace}/{controller}/{action}/{id}')提供服務的路由找到多個 控制器,並且這些控制器使用相同的名稱但不同的名稱空間定義,則不支持

WebApiConfig我的註冊功能是:

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

RegisterRoutes功能是:

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" }; 
} 

我打過電話從Global.asax中

兩個功能中的任何一個可以幫助我在這?我在這裏錯過了什麼?

謝謝,
普里亞

+0

試試這個'無功R1 = routes.MapRoute( 名稱: 「V2」, 網址: 「V2 /消息/ {}動作/(編號)」,違約 :新{控制器=」 v2「,id = UrlParameter.Optional}, namespaces:new [] {」BSB.Messages.Controllers.V2「} );' – 2016-03-11 05:49:50

+0

該框架清楚地表明它不被支持。 – Nkosi 2016-03-27 20:27:32

回答

1

第二個 「的RegisterRoutes」 方法僅適用於MVC的控制器不API控制器。應該在WebAPI啓動中完成API路由。

該行:config.MapHttpAttributeRoutes();將最適合你,但仍然需要你重新命名你的控制器類。看看這裏瞭解更多關於屬性的路由:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

這就解釋了,你可以用定義你的路由屬性裝飾你的類:

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 {...} 
} 

而在你的WebAPI的啓動,你既可以擺脫MapHTTPRoute的電話和只能去屬性,或:

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 }); 
} 

以上會導致以下工作路線:

希望有幫助!

史蒂夫

+0

我發現這不工作BTW – Yorro 2017-05-11 02:24:08

+1

重新閱讀和修復/改進的答案。謝謝! – Steve 2017-05-11 14:18:22

相關問題