2012-06-17 16 views
31

Sto cercando di aggiungere un supporto WebAPI al mio sito asp.net 4 RC e desidero inserirlo in un'area. Ho visto che qualcuno è riuscito a farlo funzionare sulla beta (here), ma per essere onesti, non ho idea di cosa sto facendo in RC.Supporto area Web ASP.Net

Qualcuno è riuscito ad aggiungere il supporto area all'RC di WebAPI?

risposta

56

Puoi mettere i controller Api in qualsiasi cartella che ti piace, non è necessario creare un'area come hai fatto per MVC. Quello che faccio di solito è creare una sottocartella "Api" nella cartella "Controllori" del sito MVC. Basta registrare i percorsi per i tuoi controller Api e funzionerà.

+3

Grazie. Si scopre che noth! Mia ha funzionato perché ho registrato il mio/api/percorso dopo il percorso predefinito, che stava catturando tutte le chiamate API –

+0

Posso avere 2 Global.asax per entrambi i siti WebAPI e asp.net 4? – Cris

+0

Compagno, hai reso la mia giornata! Grazie mille. – Rikki

4

Assicurati di registrare il percorso API prima del percorso predefinito, altrimenti il ​​percorso predefinito catturerà avidamente tutto!

13

ASP.NET MVC 4 non supporta WebAPI nelle aree.

È possibile estendere DefaultHttpControllerSelector per eseguire questa operazione, ma è necessario leggere attentamente questo eccellente (e breve) articolo: ASP.NET MVC 4 RC: Getting WebApi and Areas to play nicely. Funziona alla grande.

Ho testato con successo questa soluzione con aree portatili (MVCContrib). In sostanza, è necessario:

  • Put metodi di estensione "AreaRegistrationContextExtensions" nel progetto PA (richiesto da PortableAreaRegistration.RegisterArea() Method): è possibile copiare il classe statica nel progetto PA, ma vi consiglio di metterlo in un progetto condiviso .
  • Aggiungere la classe "AreaHttpControllerSelector" (ereditata da DefaultHttpControllerSelector) nel progetto host.
  • Aggiungi a Global.asax App_Start() la seguente riga:

    GlobalConfiguration.Configuration.Services.Replace (typeof (IHttpControllerSelector), nuova AreaHttpControllerSelector (GlobalConfiguration.Configuration));

C'è un avvertimento con l'attuazione del AreaHttpControllerSelector: il nome dell'area deve corrispondere al namespace del ApiController. Ad esempio, questo è il mio PortableAreaRegistration classe:

namespace PortableAreasSample.MembershipArea 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using MvcContrib.PortableAreas; 
    using System.Web.Http; 
    using System.Web.Mvc; 
    using System.Web.Routing; 

    public class MembershipRegistration : PortableAreaRegistration 
    { 
     public override void RegisterArea(System.Web.Mvc.AreaRegistrationContext context, IApplicationBus bus) 
     { 
      // GET /MembershipArea/GetAllUsers 
      context.MapHttpRoute("MembershipApi", 
       AreaName + "/{controller}/{id}", 
       new { area=AreaName, controller = "GetAllUsers", id = RouteParameter.Optional }); 
     } 

     public override string AreaName 
     { 
      get { return "MembershipArea"; } 
     } 
    } 
} 
19

aree di supporto nella URL web API

devi semplicemente registrare la rotta dell'API Web.

Ma questo percorso deve essere registrato prima degli altri percorsi. In caso contrario, le richieste all'API Web verranno gestite erroneamente come se fossero un'azione MVC.

Quando si utilizzano le aree, è necessario tenere conto del fatto che la registrazione delle rotte delle aree viene effettuata di solito prima della registrazione dei percorsi non dell'area. IO.e, in Global.asax Application_Start avete queste righe di codice, in questo ordine:

AreaRegistration.RegisterAllAreas(); 
// ... 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

La prima chiamata di metodo invocherà il metodo di ogni RegisterArea trovato xxxAreaRegistration classe. E, all'interno di questa configurazione è solitamente avere qualcosa di simile:

context.MapRoute(
    "AreaName_default", 
    "AreaName/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional } 
); 

Se si desidera avere i controller Web API all'interno di questa zona, è necessario aggiungere il percorso Web API prima di questo, in questo modo:

context.Routes.MapHttpRoute("AreaName_WebApiRoute", 
    "AreaName/Api/{controller}/{id}", 
    new { id = RouteParameter.Optional }); 

In questo caso, presumo che si desideri richiamare i controller API utilizzando una url come questa: /AreaName/Api/ControllerName/Id.

Io di solito memorizzo i controller API Web all'interno di una cartella Api all'interno della cartella area, ma non importa dove li mettete. Tieni conto che i controller API si troveranno ovunque si trovino e, se utilizzi lo stesso nome per loro in aree diverse, otterrai conflitti: vengono trovati dal nome della classe, non dal qualificato (namespace) nome.

In poche parole: non esiste un vero supporto per le aree, ma è possibile includerle nelle proprie cartelle all'interno delle aree e renderle disponibili su URL che assomigliano a quelli dei controller MVC all'interno delle aree.

Sostenere gli spazi dei nomi di percorso

Che cosa succede se si desidera avere controllori Web API con lo stesso nome in diversi settori? Se si desidera veramente fornire un supporto reale per le aree ai controller API Web, è necessario implementare e registrare un numero personalizzato IHttpControllerSelector.

di avere una buona spiegazione, e un esempio di implementazione qui: ASP.NET Web API: Using Namespaces to Version Web APIs

Questo esempio utilizza gli spazi dei nomi per il controllo delle versioni, ma il codice può essere leggermente modificato per sostenere aree namespace.

Problemi correlati