我正在使用asp.net核心创建web api。 api端点基于guidelines here逻辑映射到资源的关系 所以我的API看起来像
http://tax.mydomain.com/api/v1/clients/1/batches/12/start
其中Client
是Batch
的父级,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 :(得分: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)
您的设置有两个问题
http://tax.mydomain.com/clients/1/batches/12/start
但未在其中指定控制器名称。此路由查找名为ClientsController
的控制器。因此,正确的网址必须是http://tax.mydomain.com/tax/clients/1/batches/12/start
而不是您似乎使用默认的MVC / Viewbased路线,但您的网址建议您使用WebAPI。
使用WebAPI创建Rest服务时,您没有任何操作。相反,动作映射到Http动词(GET(读取),PUT(更新/替换),POST(插入),DELETE)。
因此,对于REST服务,您的默认路由应该是这样的:api/v1/{controller=Home}/{id?}