【问题标题】:Routing is not working for web api with realtions路由不适用于具有关系的 Web api
【发布时间】:2017-03-31 19:39:35
【问题描述】:

我正在使用 asp.net 核心创建 web api。 api端点根据guidelines here逻辑映射到资源的关系 所以我的 API 看起来像

      http://tax.mydomain.com/api/v1/clients/1/batches/12/start

其中ClientBatch 的父级,1 是clientid,12 是batchid,Start 是POST 操作方法。

这里是对应的控制器

public class TaxController : Controller
{
    [HttpPost]
    [Route("clients/{clientid}/batches/{batchid}/start")]
    public void Start([FromRoute]string clientId, [FromRoute]string batchId, 
                      [FromBody]IEnumerable<string> urls)
    {
       // do something
    }
}

因为api/v1 对所有控制器都是通用的,所以我在启动的Configure 方法中配置了它。我也希望Home 作为默认控制器。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
      app.UseMvc(routes =>
      {
        routes.MapRoute("default","api/v1/{controller=Home}/{action=Index}/{id?}");
      });
    }

但是客户端没有找到 api http://tax.mydomain.com/api/v1/clients/1/batches/12/start 的错误

【问题讨论】:

  • [Route("clients/{clientid}/batches/{batchid}/start")]变成[Route("api/v1/clients/{clientid}/batches/{batchid}/start")]

标签: asp.net-core asp.net-core-webapi coreclr


【解决方案1】:

任何没有路由属性的控制器方法都使用基于约定的路由。

当您使用[Route] 属性时,您定义了属性路由,因此该操作/控制器不使用常规路由。因此,您的控制器可以通过

访问
http://tax.mydomain.com/clients/1/batches/12/start

作为一个选项,您可以使用属性路由可以与继承相结合的事实。在整个控制器上设置Route 属性,这将用作路由前缀(与WebApi 中的[RoutePrefix] 属性相同):

[Route("api/v1")]
public class TaxController : Controller
{

}

来自routing 文档的更一般示例:

[Route("api/[controller]")]
public abstract class MyBaseController : Controller { ... }

public class ProductsController : MyBaseController
{
   [HttpGet] // Matches '/api/Products'
   public IActionResult List() { ... }

   [HttpPost("{id}")] // Matches '/api/Products/{id}'
   public IActionResult Edit(int id) { ... }
}

【讨论】:

  • 路由前缀是否必须在控制器级别设置?我们可以在startup.cs中设置它吗?如果是怎么办?
  • @LP13 仅在控制器级别。属性路由是关于特定控制器中的特定操作。否则,您将返回基于约定的路由。
【解决方案2】:

你的设置有两个问题

  1. 您调用http://tax.mydomain.com/clients/1/batches/12/start,但您没有在其中指定控制器名称。此路由查找名为 ClientsController 的控制器。所以正确的网址必须是http://tax.mydomain.com/tax/clients/1/batches/12/start
  2. 您似乎正在使用默认的 MVC/Viewbased 路由,但您的 url 建议您使用 WebAPI。

    当您使用 WebAPI 创建 Rest 服务时,您没有任何操作。相反,动作映射到 Http 动词(GET(读取)、PUT(更新/替换)、POST(插入)、DELETE)。

    因此,对于 REST 服务,您的默认路由应如下所示:api/v1/{controller=Home}/{id?}

【讨论】:

  • 好吧,我不想在网址中再次出现tax,因为它已经是子域的一部分。我将控制器名称更改为clients,但这也没有帮助
  • 如果您正在创建一个休息服务 (WebAPI),您不必定义动作,因为 http 动词会定义它们。您必须像在 2. 部分中那样从默认路由中删除该操作,然后调用您的控制器“ClientsController”或将调用 url 更改为 http://tax.mydomain.com/tax/1/batches/12/start
猜你喜欢
  • 2016-10-15
  • 1970-01-01
  • 2018-11-10
  • 2013-05-13
  • 2020-07-24
  • 2020-02-01
  • 2017-12-12
  • 2019-04-24
  • 2014-06-21
相关资源
最近更新 更多