0

这可能是一个奇怪的问题,但我在这个问题上挣扎了几个小时,最后我不知道发生了什么,并且觉得我从根本上误解了这一切。

以下示例:

[RoutePrefix("api/customers")]
public class ExampleController : Controller
{
    [HttpGet]
    [Route("{customerId}")]
    public ActionResult Read(string customerId)
    {
        return new HttpStatusCodeResult(HttpStatusCode.OK);
    }

    [HttpPost]
    [Route("")]
    public ActionResult Create(CreateCustomerModel model)
    {
        // do stuff
        return new HttpStatusCodeResult(HttpStatusCode.OK);
    }
}

当我使用 MVC 控制器设计这样的控制器时,当我尝试向第一个操作发出请求时出现错误 (GET localhost:1234/api/customers/blabla)

我做了很多试验和错误来找出为什么会发生这种情况。顺便说一句,我收到以下错误消息(不幸的是,这是德语): 在此处输入图像描述

翻译:

消息:未找到与请求 URI \" http://localhost:53741/api/customers/blabla \"匹配的 HTTP 资源

MessageDetail: 未找到与名称为“customers”的控制器匹配的类型

现在,问题是,如果我更改 Routeprefix,因此它不包含“api”,而是包含其他内容,例如“mapi”(或其他),那么它就可以工作了!所以我想知道“api”是否是某种关键字。然后我将控制器更改为 ApiController(并调整所有类型和东西),然后它仍然有效!

这使得看起来当路由以“api”这个词开头时,程序需要一个 ApiController?真的吗?为什么?

你可能会说,你为什么不直接使用 ApiController,它完全是为了创建 API 的目的而制作的,在某些方面你可能是对的,但与 MVC 控制器相比,我对 ApiController 的体验并不好。它受到更多限制且不太先进(例如,您只能从主体绑定单个参数,我忘记了所有其他限制)。我研究了很多次为什么应该使用 ApiController 以及何时应该使用 Controller,但从未找到 ApiController 令人信服的论据,因为我也可以使用 Controller 做所有事情(我唯一的猜测是它有一些开销或其他东西)。无论如何,这不是问题的重点,重点是为什么我不能在 Controller 中使用“api”。

这是 ASP.NET Framework 4.7.2 顺便说一句。

4

0 回答 0