2012-06-17 21 views
31

Estoy tratando de agregar algo de soporte WebAPI a mi sitio asp.net 4 RC, y deseo ponerlo en un área. He visto que alguien logró ejecutar esto en la versión beta (here), pero para ser sincero, no tengo idea de lo que estoy haciendo en la RC.ASP.Net WebAPI area support

¿Alguien ha logrado agregar soporte de área al RC de WebAPI?

Respuesta

56

Puede colocar controladores Api en la carpeta que desee, no necesita crear un Área como lo hizo para MVC. Lo que suelo hacer es crear una subcarpeta 'Api' dentro de la carpeta 'Controladores' del sitio MVC. Simplemente registre rutas para sus controladores Api y funcionará.

+3

Gracias. Resultó que nada mío funcionaba porque registré mi/api/route después de la ruta predeterminada, que capturaba todas las llamadas de API –

+0

¿Puedo tener 2 Global.asax para el sitio WebAPI y asp.net 4? – Cris

+0

¡Compañero, hiciste mi día! Muchas gracias. – Rikki

4

¡Asegúrese de registrar la ruta API antes de la ruta predeterminada, de lo contrario, la ruta predeterminada capturará con avidez todo!

13

ASP.NET MVC 4 no es compatible con WebAPI en áreas.

Es posible ampliar DefaultHttpControllerSelector para hacer esto, pero debe leer detenidamente este excelente (y corto) artículo: ASP.NET MVC 4 RC: Getting WebApi and Areas to play nicely. Funciona muy bien.

He probado con éxito esta solución con áreas portátiles (MVCContrib). Básicamente, usted tiene que:

  • Poner los métodos de extensión "AreaRegistrationContextExtensions" en el proyecto PA (requerido de PortableAreaRegistration.RegisterArea() método): puede copiar la clase estática en el proyecto PA pero me sugieres para ponerlo en un proyecto compartido .
  • Agregue la clase "AreaHttpControllerSelector" (heredada de DefaultHttpControllerSelector) en el proyecto de host.
  • Añadir a Global.asax App_Start() la siguiente línea:

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

Hay una advertencia con la implementación de AreaHttpControllerSelector: el nombre del área debe corresponder al espacio de nombres del ApiController. Por ejemplo, esta es mi clase PortableAreaRegistration:

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

áreas de reparto en la URL de la API web

Usted simplemente tiene que registrar la ruta de la API web.

Pero esta ruta debe estar registrada antes que las otras rutas. De lo contrario, las solicitudes a la API web se manejarán por error como si fueran una acción de MVC.

Al utilizar áreas, debe tener en cuenta que el registro de las rutas de áreas generalmente se realiza antes del registro de las rutas que no son de área. YO.e, en Global.asax Application_Start usted tiene estas líneas de código, en este orden:

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

La primera llamada al método invocará el método de todos los RegisterArea encontró xxxAreaRegistration clase. Y, dentro de esta configuración por lo general tendrá algo como esto:

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

Si usted quiere tener controladores de API Web dentro de esta área, debe agregar la ruta API Web antes de éste, así:

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

En este caso, supongo que desea invocar sus controladores de API usando una url como esta: /AreaName/Api/ControllerName/Id.

Normalmente guardo los controladores de API web dentro de una carpeta Api dentro de la carpeta de área, pero no importa dónde los coloque. Tenga en cuenta que los controladores API se encontrarán donde estén y, si usa el mismo nombre para ellos en diferentes áreas, obtendrá conflictos: se encuentran por el nombre de la clase, no por los completamente calificados (espacio de nombres) nombre.

En pocas palabras: no hay soporte real para las áreas, pero puede incluirlas en sus propias carpetas dentro de las áreas, y ponerlas a disposición en URL que se parecen a las de los controladores MVC dentro de las áreas.

apoyo espacios de nombres de ruta

¿Qué pasa si usted quiere tener controladores de API Web con el mismo nombre en diferentes áreas? Si realmente desea dar soporte real para las áreas a los controladores de API web, debe implementar y registrar un IHttpControllerSelector personalizado.

que tenga una buena explicación, y una implementación de ejemplo aquí: ASP.NET Web API: Using Namespaces to Version Web APIs

este ejemplo se utiliza espacios de nombres para el control de versiones, pero el código puede ser modificado ligeramente a favor de las áreas de espacios de nombres.

Cuestiones relacionadas