【问题标题】:Webapi and normal methods in the same controller?Webapi 和普通方法在同一个控制器中?
【发布时间】:2018-11-09 07:48:34
【问题描述】:

随着asp.net core 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)

非常感谢任何输入。

【问题讨论】:

  • 提示:CustomerOrders 是一个 HttpGet 方法,你如何发送这两种方法的请求以及为什么 GET 请求不起作用?
  • 你说的无法运行是什么意思?不打?返回null?你期望得到什么?
  • @ibubi 抱歉,我更新了我的帖子。
  • @TetsuyaYamamoto customerorder 不是httpget,它是返回视图的正常操作方法
  • 您不能在标有ApiControllerAttribute 的控制器内使用return View()。您只能使用BadRequestResultNotFoundResultOkObjectResult。如果你在没有提供属性路由的情况下放置[HttpGet] 属性会发生什么?

标签: c# asp.net-core


【解决方案1】:

你是说你不能打电话给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);
        }
}

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 2017-01-05
    • 1970-01-01
    • 2018-06-29
    • 2022-01-07
    • 2010-11-22
    • 2018-05-20
    • 2021-07-26
    • 2021-08-15
    相关资源
    最近更新 更多