2017-03-31 34 views
1

我正在使用asp.net核心创建web api。该API终点逻辑映射到资源的关系基于guidelines here 所以我的API看起来路由不适用于网页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

+0

打开'[路线( “客户端/ {的clientid} /批次/ {batchid} /启动”)]'入'[ Route(“api/v1/clients/{clientid}/batch/{batchid}/start”)]' –

回答

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) { ... } 
} 
+0

是否需要在控制器级设置路由前缀?我们可以在startup.cs中设置它吗?如果是的话如何? – LP13

+0

@ LP13仅限于控制器级别。属性路由是关于特定控制器中的特定操作。否则,您将转向基于约定的路由。 – Set

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 Verbs(GET(读取),PUT(更新/替换),POST(插入),DELETE)。

    所以对于REST服务的默认路由应该是这样的,而不是:api/v1/{controller=Home}/{id?}

+0

好吧,我不想在网址中再次征税,因为它已经是子域的一部分。我将控制器名称更改为“客户端”,但这并没有帮助 – LP13

+0

如果您要创建剩余服务(WebAPI),则不必定义操作,因为http动词定义了它们。你必须从你的默认路由中删除动作,就像在第2节中一样,然后调用你的控制器“ClientsController”或者将调用URL改为http://tax.mydomain.com/tax/1/batches/12/ start' – Tseng