【问题标题】:URL Routing with WEB API and Area in MVC5在 MVC5 中使用 WEB API 和区域进行 URL 路由
【发布时间】:2014-01-13 14:38:15
【问题描述】:

我正在开发一个 MVC 5 应用程序。我创建了一个名为Organization 的区域。我还在该区域的控制器文件夹中创建了一个(API)文件夹。所以我的结构变成了像

/Areas/Organization/Controllers/API/OrganizationAPI

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

我已尝试使用此网址

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

getData 是我的操作方法。但它说找不到资源。任何人都可以帮助我了解如何注册自己的路由,以便我可以使用 URL 映射我的操作,并建议我一些参考 URL 用于 MVC 4 或更高版本中的 URL 路由。

【问题讨论】:

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


【解决方案1】:

如果您的项目已经包含 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 }
        );
    }
}

【讨论】:

  • 我希望有一个不需要在全局 WebApiConfig 中初始化区域的解决方案。似乎应该有一种方法可以使用 AreaRegistration 来做到这一点,以便区域保持(概念上)解耦。
  • 你应该可以做这样的事情(路由约束):asp.net/web-api/overview/web-api-routing-and-actions/…
【解决方案2】:

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

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

所以要调用你的get data方法,url应该是这样的:Area/API/Controller,不要添加方法名。

【讨论】:

    【解决方案3】:

    您可以只创建另一条路由来模拟区域,但这仅与“命名空间”概念不能很好地配合:您将看到一个区域中的控制器可以从另一个区域访问。这是因为“AREA”在 Web API 中并没有像 MVC 路由那样真正被计算在内。

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

    找到了与名为“tickets”的控制器匹配的多种类型。 如果服务此请求的路由会发生这种情况 (‘api/{controller}/{id}’) 找到了多个使用 名称相同但命名空间不同,这是不受支持的。这 'tickets' 的请求找到了以下匹配的控制器: .....

    我的解决方案是遵循 Martin Devlers 博客中的这个优雅的解决方法:

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

    SoFarSoGood!

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 2015-01-06
      • 2012-02-19
      • 2016-12-06
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      相关资源
      最近更新 更多