2012-06-17 11 views
31

Ich versuche, meiner asp.net 4 RC-Site einige WebAPI-Unterstützung hinzuzufügen und möchte sie in einen Bereich einfügen. Ich habe gesehen, dass jemand es geschafft hat, das auf der Beta laufen zu lassen (here), aber um ehrlich zu sein, habe keine Ahnung, was ich in der RC mache.ASP.Net WebAPI-Bereichsunterstützung

Hat es jemand geschafft, dem RC von WebAPI Bereichsunterstützung hinzuzufügen?

Antwort

56

Sie können die Api-Controller in einen beliebigen Ordner stellen, Sie müssen keinen Bereich erstellen, den Sie für MVC verwendet haben. Normalerweise erstelle ich einen Unterordner 'Api' im Ordner 'Controller' der MVC-Site. Einfach Routen für Ihre Api-Controller registrieren und es wird funktionieren.

+3

Danke. Es stellt sich heraus, dass nichts von meiner Arbeit funktioniert, weil ich meine/api/route nach der Standardroute registriert habe, die alle API-Aufrufe aufzeichnete –

+0

Kann ich 2 Global.asax für WebAPI und asp.net 4 Site haben? – Cris

+0

Kumpel, du hast meinen Tag gemacht! Vielen Dank. – Rikki

4

Stellen Sie sicher, dass Sie die API-Route vor der Standardroute registrieren, sonst wird die Standardroute gierig alles erfassen!

13

ASP.NET MVC 4 unterstützt WebAPI in Bereichen nicht.

Es ist möglich, DefaultHttpControllerSelector zu erweitern, um dies zu tun, aber Sie sollten diesen ausgezeichneten (und kurzen) Artikel sorgfältig lesen: ASP.NET MVC 4 RC: Getting WebApi and Areas to play nicely. Es funktioniert großartig.

Ich habe diese Lösung erfolgreich mit tragbaren Bereichen getestet (MVCContrib). Grundsätzlich müssen Sie:

  • Put Erweiterungsmethoden „AreaRegistrationContextExtensions“ in der PA-Projekt (erforderlich von PortableAreaRegistration.RegisterArea()-Methode): Sie können die statische Klasse in die PA-Projekt kopieren können, aber ich schlage vor, es in ein gemeinsames Projekt zu setzen .
  • Fügen Sie die Klasse "AreaHttpControllerSelector" (geerbt von DefaultHttpControllerSelector) in das Hostprojekt ein.
  • In der Global.asax App_Start() die folgende Zeile:

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

Es gibt eine Einschränkung bei der Umsetzung von AreaHttpControllerSelector: der Bereichsname auf den ApiController Namensraum entspricht. Zum Beispiel, das ist meine PortableAreaRegistration Klasse:

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

Stützflächen in den Web-API-URLs

Sie müssen einfach Registrieren Sie die Web-API-Route.

Diese Route muss jedoch vor den anderen Routen registriert werden. Ist dies nicht der Fall, werden die Anforderungen an die Web-API fälschlicherweise so behandelt, als wären sie eine MVC-Aktion.

Wenn Sie Gebiete verwenden, müssen Sie berücksichtigen, dass die Registrierung für die Routen der Gebiete in der Regel vor der Registrierung der Strecken außerhalb des Gebiets erfolgt. ICH.e, in Global.asax Application_Start haben Sie diese Zeilen Code, in dieser Reihenfolge:

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

Die erste Methode Aufruf der RegisterArea Methode von jeder xxxAreaRegistration Klasse gefunden aufrufen wird. Und innerhalb dieser Konfiguration werden Sie in der Regel etwas wie dieses:

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

Wenn Sie Controller Web-API haben in diesem Bereich, müssen Sie die Web-API-Route vor diesem hinzufügen, etwa so:

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

In diesem Fall nehme ich an, dass Sie Ihre API-Controller mit einer URL wie folgt aufrufen möchten: /AreaName/Api/ControllerName/Id.

Normalerweise speichern ich die Web-API-Controller in einem Ordner Api im Bereich Ordner, aber es spielt keine Rolle, wo Sie sie platzieren. Berücksichtigen Sie, dass die API-Controller immer dort zu finden sind, wo sie sind. Wenn Sie denselben Namen für sie in verschiedenen Bereichen verwenden, erhalten Sie Konflikte: Sie werden nach dem Klassennamen und nicht nach dem voll qualifizierten Namen (Namespaced) gefunden. Name.

In wenigen Worten: Es gibt keine echte Unterstützung für Bereiche, aber Sie können sie in ihre eigenen Ordner innerhalb der Bereiche aufnehmen und sie auf URLs zur Verfügung stellen, die denen von MVC-Controllern in Bereichen ähneln.

Unterstützung Route Namespaces

Was ist, wenn Sie Web-API-Controller mit dem gleichen Namen in verschiedenen Bereichen haben? Wenn Sie Web API Controller wirklich unterstützen möchten, müssen Sie eine benutzerdefinierte IHttpControllerSelector implementieren und registrieren.

Sie haben eine gute Erklärung, und eine Beispielimplementierung hier: ASP.NET Web API: Using Namespaces to Version Web APIs

Dieses Beispiel Namespace für die Versions verwendet, aber der Code leicht modifiziert werden kann, um Bereiche Namespaces zu unterstützen.