2014-10-18 17 views
7

Ho bisogno di avere controller con lo stesso nome in namespace diversi. I controllori Sto avendo sono:Controller con lo stesso nome in diversi NameSpace API Web ASP.NET

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

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

Ho provato a configurare in start up. Ma ancora quando faccio una chiamata mostra errore:

Sono stati trovati più tipi che corrispondono al controller denominato "messaggi". Questo può accadere se la route che fornisce questa richiesta ('api/{namespace}/{controller}/{action}/{id}') ha trovato più controller definiti con lo stesso nome ma spazi dei nomi differenti, che non è supportato

La mia funzione Register in WebApiConfig è:

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

La mia funzione è 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" }; 
} 

ho chiamato entrambe le funzioni da Global.asax

Uno può aiutarmi in questo? Cosa mi sono perso qui?

Grazie,
Priya

+0

provare questo 'var r1 = routes.MapRoute ( nome: "V2", url: "/ messaggi/{action} v2/{id}", default: new {regolatore =" v2 ", id = UrlParameter.Optional}, namespace: new [] {" BSB.Messages.Controllers.V2 "} );' –

+0

Il framework afferma chiaramente che non è supportato. – Nkosi

risposta

1

Il secondo metodo "RegisterRoutes" si applica solo a non controller MVC controllori API. Il routing dell'API deve essere eseguito all'avvio di WebAPI.

La riga: config.MapHttpAttributeRoutes(); funzionerà meglio per te, ma richiederà comunque di rinominare le classi del controller. Date un'occhiata qui per maggiori informazioni su attributi di routing: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

che spiega che si potrebbe decorare le classi con gli attributi che definiscono i percorsi:

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

E nel tuo avvio WebAPI si potrebbe o sbarazzarsi del MapHTTPRoute chiamate e vanno attributo solo, o:

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

che questo comporterebbe seguenti percorsi di lavoro:

Sperare che aiuti!

Steve

+0

Ho trovato che non funziona BTW – Yorro

+1

Risposta riletta e corretta/migliorata. Grazie! – Steve

Problemi correlati