使用WEB API和MVC5中的区域进行URL路由

时间:2013-12-25 20:10:00

标签: asp.net-mvc asp.net-mvc-4 routing url-routing asp.net-mvc-5

我正在研究MVC 5应用程序。因为我创建了一个名为Organization的区域。我还在该区域的controllers文件夹中创建了一个(API)文件夹。所以我的结构变得像

/Areas/Organization/Controllers/API/OrganizationAPI

其中OrganizationAPIOrganization区域的API控制器。现在我的问题是关于MVC中的路由。我无法找到哪个URL会调用我的API。

我尝试使用此网址

http://localhost:80/Organization/API/OrganizationAPI/getData

其中getData是我的操作方法。但它说没有找到资源。有什么可以帮助我理解我如何注册我自己的路线,以便我可以用URL映射我的行为,并建议我在MVC 4或更高版本中的URL路由的一些参考URL。

3 个答案:

答案 0 :(得分:8)

如果您的项目已包含WebApiConfig.cs文件,那太好了!您只需添加如下路线:

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

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // NEW ROUTE FOR YOUR AREA
        config.Routes.MapHttpRoute(
            name: "API Area Default",
            routeTemplate: "api/AREA/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

答案 1 :(得分:1)

为API控制器创建的默认路由不考虑方法名称(在您的情况下为getData),而不是像常规控制器中那样。它取决于http方法(get / post / put / delete)和你发送的参数,action方法应该与http方法名称相同(例如getData,将在使用get方法时调用)。

您可以添加自定义路由以按名称调用api控制器上的操作。

因此,要调用get数据方法,网址应如下所示:区域/ API /控制器,请勿添加方法名称。

答案 2 :(得分:1)

您可以创建另一条路线来模拟区域,但这仅适用于“命名空间”概念:您将看到一个区域中的控制器可以从其他区域访问。这是因为“AREA”在Web API中并不像MVC路由那样真正计算在内。

因此,如果您的控制器在不同区域中具有相同名称,则会抛出异常:

  

找到了多个匹配名为“ticket”的控制器的类型。   如果为此请求提供服务的路由,则会发生这种情况   ('api / {controller} / {id}')发现了多个控制器   同名但不同的命名空间,不受支持。该   请求'门票'找到了以下匹配的控制器:   .....

我的解决方案是遵循Martin Devillers Blog的优雅解决方法:

http://blogs.infosupport.com/asp-net-mvc-4-rc-getting-webapi-and-areas-to-play-nicely/

SoFarSoGood!