【问题标题】:Custom Routing with ASP.NET Web API使用 ASP.NET Web API 的自定义路由
【发布时间】:2012-12-29 15:05:42
【问题描述】:

假设我有一个嵌套的一对多类型的层次结构数据库,如下所示:

一个地区有多个国家;每个国家都有许多城市城市必须属于唯一一个国家/地区。

将这些信息抽象到 RDBMS 中是一项简单的练习,但(在我看来)返回 给定区域 id 的国家/地区列表的最明智的 REST 端点将类似于以下内容:

HTTP GET http://localhost/Region/3/Countries

默认情况下,.NET Web API 的路由最多为http://localhost/Countries/Region/3http://localhost/Region/Countries/3

我是否应该遵循一个合理的命名约定,或者路由是否可以自定义以允许 URI 采用我喜欢的任何形状?

【问题讨论】:

  • 我想我应该补充一点,我正在使用现有的 DBMS,并希望为数据存储构建公共/私有 API。

标签: c# rest asp.net-mvc-4 namespaces asp.net-web-api


【解决方案1】:

路由应该具有足够的可定制性,以获取您正在寻找的 URL。假设你想要 'http://localhost/Region/3/Countries' 形式的 URL,你可以注册这个自定义路由:

config.Routes.MapHttpRoute("MyRoute", "Region/{regionId}/Countries", new { controller = "Region", action = "GetCountries" });

这会将请求分派到“RegionController”类上的“GetCountries”操作。您可以在从 URI 自动为您绑定模型的操作上设置 regionId 参数。

您可能想在线查找 WebAPI 的属性路由包,因为它可能更适合您的情况。

【讨论】:

    【解决方案2】:

    路由应该非常灵活 - 问题是您希望如何提供数据。您心中有一个控制器还是多个控制器?

    如果你有一个 RegionController,我不明白你为什么不能配置路由:

    routes.MapHttpRoute(
        name: "CountryList",
        routeTemplate: "{controller}/{regionId}/countries"
    );
    

    以及对应的方法:

    public CountryCollection Get(int regionId)
    

    或者我在你的问题中遗漏了什么?您的默认路由来自哪里?

    看看他们的文档:

    http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2020-07-24
      • 2018-02-23
      相关资源
      最近更新 更多