2014-10-18 14 views
7

Potrzebuję kontrolerów o tej samej nazwie w różnych obszarach nazw. Sterowniki mam to:Kontrolery o tej samej nazwie w innym NameSpace ASP.NET WEB API

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

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

próbowałem skonfigurować go w rozruchu. Ale wciąż, gdy dzwonię, pokazuje błąd, który:

Znaleziono wiele typów pasujących do kontrolera o nazwie "messages". Może się to zdarzyć, jeśli trasa obsługująca to żądanie ("api/{namespace}/{controller}/{action}/{id}") wykryła wiele kontrolerów zdefiniowanych z tą samą nazwą, ale różniących się obszarami nazw, które nie są obsługiwane przez

Moja funkcja Rejestracja w WebApiConfig jest:

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

Moja RegisterRoutes funkcja:

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

Zadzwoniłem obie funkcje z Global.asax

Może ktoś mi pomóc w tym? Co tu przeoczyłem?

Dzięki,
Priya

+0

spróbować 'var R1 = routes.MapRoute ( nazwa: "V2", url: "v2/Wiadomości/{action}/{id}", domyślnie: new {controller =” v2 ", id = UrlParameter.Optional}, namespaces: new [] {" BSB.Messages.Controllers.V2 "} );' –

+0

Framework wyraźnie stwierdza, że ​​nie jest obsługiwany. – Nkosi

Odpowiedz

1

Drugi "RegisterRoutes" metoda ma zastosowanie tylko do kontrolerów MVC nie kontrolerów API. Routing API powinien odbywać się podczas uruchamiania WebAPI.

Wiersz: config.MapHttpAttributeRoutes(); będzie działać najlepiej dla ciebie, ale nadal będzie wymagać zmiany nazw kontrolerów. Spójrz tutaj bardziej o routingu atrybut: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

Co wyjaśnia, że ​​można ozdobić swoje zajęcia z atrybutów, które definiują swoje trasy:

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

iw swoim starcie WebAPI można też pozbyć się MapHTTPRoute połączenia i idź atrybut tylko, czyli

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

powyższe spowodowałoby następujących trasach pracy:

Mam nadzieję, że to pomoże!

Steve

+0

Znalazłem, że nie działa BTW – Yorro

+1

Ponownie przeczytaj i poprawiono/poprawiono odpowiedź. Dzięki! – Steve