让ApiController与区域一起工作?

Mat*_*zen 6 c# asp.net-mvc

我目前在ASP .NET MVC 5项目中有两个区域.一个叫做支持者,一个叫做查特.在这两个区域中的每一个区域中都有一个ApiController名称CommunicationController,由于ApiController路由的工作性质,这会产生问题.

问题的一个例子

如果我只在一个区域中ApiController命名CommunicationController了一个,它的路由将不包括URL中的区域,并且URL将是这样的:

http://example.com/api/communication/someAction

但在上面的URL中,该区域在哪里?

由于我的两个控制器命名相同,它们现在都有路由问题.

我试过了什么?

我尝试按照这里的说明操作:http://blogs.infosupport.com/asp-net-mvc-4-rc-getting-webapi-and-areas-to-play-nicely/

它们似乎适用于ASP .NET MVC 4 RC,由于我使用的是MVC 5,因此它不再具有相关性,这可能就是它无法正常工作的原因.

但是,从该博文中回顾一下,这是我的路由文件.

App_Start\RouteConfig.cs

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute("Default", "{controller}/{action}",
            new {action = "Index", controller = "Home"},
            new[] { "Website.Controllers" }
            );
    }
}
Run Code Online (Sandbox Code Playgroud)

App_Start\WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        //the two lines below were added.
        config.Routes.MapHttpRoute("SupportersApi", "api/supporters/{controller}/{id}", new {id = RouteParameter.Optional, area = "Supporters"}
            );
        config.Routes.MapHttpRoute("ChatterApi", "api/chatter/{controller}/{id}", new { id = RouteParameter.Optional, area = "Chatter" }
            );
    }
}
Run Code Online (Sandbox Code Playgroud)

区\颤振\ ChatterAreaRegistration.cs

public class ChatterAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Chatter"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {

        //the below line was added.
        context.Routes.MapHttpRoute("Chatter_api", "api/chatter/{controller}/{id}", new { id = RouteParameter.Optional, area = "Chatter" }
            );

        context.MapRoute(
            "Chatter_default",
            "Chatter/{controller}/{action}/{id}",
            new {action = "Index", id = UrlParameter.Optional}
            );
    }
}
Run Code Online (Sandbox Code Playgroud)

区\支持者\ SupportersAreaRegistration.cs

public class SupportersAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Supporters";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        //the below line was added.
        context.Routes.MapHttpRoute("Supporters_api", "api/supporters/{controller}/{id}", new { id = RouteParameter.Optional, area = "Supporters" }
            );

        context.MapRoute(
            "Supporters_default",
            "Supporters/{controller}/{action}/{id}",
            new { action = "Index", controller = "Home", id = UrlParameter.Optional }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么,我有什么选择?

Cle*_*ism 5

使用WebAPI 2属性,因为您正在使用MVC 5,并且您可以通过声明API的路由及其实现来删除大量样板代码(您还可以为HTTP操作指定谓词,甚至使用属性自动转换为XML/JSON /本月序列化).

除非您出于其他原因使用区域,否则您实际上不需要它们来实现Web API.

特别是,你想要的是RoutePrefix属性.