Webapi和普通方法在同一个控制器中



随着asp.net核心2.1中Apicontroller属性的引入,我想知道如何让api和普通方法在同一个控制器中工作。

[Route("api/[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
[HttpPost]
public async Task<IActionResult> SaveOrder(SaveOrderModel model)
{
//...
}
public async Task<IActionResult> CustomerOrders()
{
if (!User.IsInRole("Customer"))
return Challenge();
var customer = await _workContext.CurrentCustomer();
var model = await orderModelFactory.PrepareCustomerOrderListModel();
return View(model);
}
}

我可以调用post方法/api/order/saveorder,但不能运行https://example.com/order/customerorders

它显示了一个异常:InvalidOperationException:Action".CustomerOrders"没有属性路由。上的操作方法用ApiControllerAttribute注释的控制器必须是属性路由。

如果我在控制器级别上删除[ApiController]和[Route("api/[controller]"(],而放在方法级别上,那么它肯定能工作。我仍然不知道这些方法是否有更好的混合解决方案,因为我想使用这个新的ApiController功能。

[Route("/api/controller/saveorder")]
public async Task<IActionResult> SaveOrder(SaveOrderModel model)

任何意见都将不胜感激。

您的意思是,您不能调用https://example.com/order/customerorders。在您定义的[Route("api/[controller]")]中,此控制器中的所有方法都将在https://example.com/api/order/中可用。

因此,要调用您的方法,您需要调用https://example.com/api/order/customerorders

如果你想使用https://example.com/order/customerorders,你需要把[Route]属性放在你的方法上:

[ApiController]
public class OrderController : ControllerBase
{
[HttpPost("api/order")]
public async Task<IActionResult> SaveOrder(SaveOrderModel model)
{
...
}
[HttpGet("order/customerorders")]
public async Task<IActionResult> CustomerOrders()
{
if (!User.IsInRole("Customer"))
return Challenge();
var customer = await _workContext.CurrentCustomer();
var model = await orderModelFactory.PrepareCustomerOrderListModel();
return View(model);
}
}

最新更新