如何从 ASP.NET 核心页面调用我的 API 控制器对象?

How do I call my API controller object from an ASP.NET Core page?

我这里可能用词不当,所以如果我用错了词,请原谅并纠正我。我来自传统 ASP.Net Web 应用程序的世界,在那里我可以简单地向我的 Web 应用程序项目添加一个 ApiController 并开始工作 运行。但是,我现在使用的 ASP.Net 核心 Web 应用程序似乎并非如此。

我创建了一个 Web 应用程序项目:

选择 Web 应用程序类型:

然后我把我的控制器添加到根目录:

为其编写了一小段代码:

[Route("[controller]")]
[ApiController]
public class ModulesController : ControllerBase {
    [HttpPost]
    [Route("Modules/Execute")]
    public void Execute([FromBody] string key) => ModuleManager.Instance.TryExecute(key);
}

然后尝试用AJAX调用它:

$.ajax(
    {
        contentType: "application/json",
        data: JSON.stringify({ executionKey: executionKey }),
        dataType: "jsond",
        type: "POST",
        url: "/Modules/Execute",
        failure: function (msg) {
            alert("failure");
        },
        success: function (msg) {
            alert("success");
        }
    });

Annnnnd 我收到一个 404 错误,说找不到它。

现在,我尝试了其他几种方法,例如:

^

endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller}/{action=Index}/{id?}");

一路上还有其他几次失败的尝试。很明显,我在这个新设置中遗漏了一些基本的东西,我不知道它是什么。


如何从我的 ASP.NET 核心网页调用我的 API 控制器?

注意: 我试过手动点击它作为 GET 看看是否可能是路径问题,但不能那样点击无论我尝试了多少种不同的组合。

被叫URL

"/Modules/Execute"

与控制器上的路由不匹配。

[Route("[controller]")] //<- Prefixes all Actions on this controller with controller name
[ApiController]
public class ModulesController : ControllerBase {
    
    [HttpPost]
    [Route("Modules/Execute")] //<- This route resolves to: POST Modules/Modules/Execute
    public void Execute([FromBody] string key) => ModuleManager.Instance.TryExecute(key);
}

因此,要么更新客户端以调用正确的 URL,要么将控制器路由更新为所需的 URL。

几个问题:

  1. 确保你正在映射控制器(你提到你试过它,但它必须存在,在Startup.cs):
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();  // if you need it; there by default
                endpoints.MapControllers();
            });
  1. 您的路线不正确 - 路线是累积的,因此如果您在 Controller class 上指定 [Route],它在较旧的 ASP.NET 框架;改变你的路线路线:
    [HttpPost]
    [Route("Execute")] //<- This route resolves to: POST Modules/Execute
    public void Execute([FromBody] string key) => ModuleManager.Instance.TryExecute(key);

或者,您可以从控制器中删除 [Route] 属性;再一次,您提到您尝试过,但可能没有同时解决其余问题。

  1. 您的 ajax 调用发送了一个 JSON 对象,但您的函数需要一个 string。更改调用,或(更好的主意)引入包含密钥的 Model

出现这 3 个问题中的任何一个 都会导致 404。

顺便说一句,考虑返回 IActionResult 而不是 voidhttps://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1