【问题标题】:How do I call my API controller object from an ASP.NET Core page?如何从 ASP.NET Core 页面调用我的 API 控制器对象?
【发布时间】:2020-08-12 23:40:16
【问题描述】:

这里的措辞可能全都错了,如果我用错了词,请原谅并纠正我。我来自传统 ASP.Net Web 应用程序的世界,我可以简单地将 ApiController 添加到我的 Web 应用程序项目并开始运行。但是,我现在使用的 ASP.Net Core 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 错误,提示找不到。

现在,我尝试了其他一些方法,例如:

  • 更改获取。
  • 从控制器中删除Route
  • 添加控制器路由映射到Startup.cs:

^

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

在此过程中还有其他几次失败的尝试。我显然错过了这个新设置的一些基本内容,我无法弄清楚它是什么。


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

注意:我尝试手动将其设为GET,以查看是否可能是路径问题,但无论有多少不同,也无法以这种方式点击它我试过的组合。

【问题讨论】:

  • Modules 控制器你有一个返回 void 的方法。此类方法作为端点公开。您需要在 Controller 中创建操作方法。

标签: c# api asp.net-core razor-pages web-application-project


【解决方案1】:

调用的 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。

【讨论】:

  • 听起来[Route("[controller]")] 可能没有做他们想做的事,因此没有必要,应该被删除?
  • @Brad 实际上,这通常是在控制器上设置路由的建议方法。动作路由应该是[Route("Execute")],当与控制器上的路由结合时,它会解析为所需的 URL Modules/Execute
  • OP 确实提到他们尝试从控制器中删除 [Route] 属性。有超过 1 个问题。 @Brad,控制器上的 [Route] 充当 [RoutePrefix] 属性,该属性存在于 .NET Framework 版本的 Web API 中
  • 这是最初的问题,我通过将 AJAX 调整为指向 /Modules/Modules/Execute 来确认它,这很奇怪,因为我确定我试过了。也许没有以/ 开头?不确定,但@CoolBots 是正确的,我有不止一个问题,他们的答案解决了这个问题。您介意我将他们的答案标记为我的问题的可接受答案以帮助未来的读者吗?我把决定留给你,因为你是第一个回答的,技术上解决了我的问题。 :)
  • @Taco 根本不是问题。他们显然更详细。
【解决方案2】:

几个问题:

  1. 确保您正在映射控制器(您在Startup.cs 中提到您尝试过它,但它必须在那里):
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();  // if you need it; there by default
                endpoints.MapControllers();
            });
  1. 您的路由不正确 - 路由是累积的,因此如果您在 Controller 类上指定 [Route],它在旧 ASP.NET 框架中充当 [RoutePrefix];更改方法上的路线:
    [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

这三个问题中的任何一个都会导致 404。

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

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 2020-10-18
    • 2015-08-18
    • 2023-02-04
    • 2020-05-04
    • 2016-04-30
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多