路由不适用于具有实现的web api

时间:2017-03-31 19:39:36

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

我正在使用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

,客户端未找到错误

2 个答案:

答案 0 :(得分: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) { ... }
}

答案 1 :(得分:0)

您的设置有两个问题

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

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

    因此,对于REST服务,您的默认路由应该是这样的:api/v1/{controller=Home}/{id?}