如何从 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 错误,说找不到它。
现在,我尝试了其他几种方法,例如:
- 换取。
- 正在从控制器中删除
Route
。
- 添加控制器路由映射到
Startup.cs
:
^
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。
几个问题:
- 确保你正在映射控制器(你提到你试过它,但它必须存在,在
Startup.cs
):
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages(); // if you need it; there by default
endpoints.MapControllers();
});
- 您的路线不正确 - 路线是累积的,因此如果您在
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] 属性;再一次,您提到您尝试过,但可能没有同时解决其余问题。
- 您的 ajax 调用发送了一个 JSON 对象,但您的函数需要一个
string
。更改调用,或(更好的主意)引入包含密钥的 Model。
出现这 3 个问题中的任何一个 都会导致 404。
顺便说一句,考虑返回 IActionResult
而不是 void
:https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1
我这里可能用词不当,所以如果我用错了词,请原谅并纠正我。我来自传统 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 错误,说找不到它。
现在,我尝试了其他几种方法,例如:
- 换取。
- 正在从控制器中删除
Route
。 - 添加控制器路由映射到
Startup.cs
:
^
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。
几个问题:
- 确保你正在映射控制器(你提到你试过它,但它必须存在,在
Startup.cs
):
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages(); // if you need it; there by default
endpoints.MapControllers();
});
- 您的路线不正确 - 路线是累积的,因此如果您在
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] 属性;再一次,您提到您尝试过,但可能没有同时解决其余问题。
- 您的 ajax 调用发送了一个 JSON 对象,但您的函数需要一个
string
。更改调用,或(更好的主意)引入包含密钥的 Model。
出现这 3 个问题中的任何一个 都会导致 404。
顺便说一句,考虑返回 IActionResult
而不是 void
:https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1