gpt4 book ai didi

c# - ASP.NET Core API 中的常规路由

转载 作者:行者123 更新时间:2023-12-01 22:09:55 25 4
gpt4 key购买 nike

问题:

我正在使用 NET Core 3.1 创建一个 API 应用程序。我想避免在每个 ApiControllers 和操作上设置路由属性。我在 UseEndpoints 上尝试了很多组合来设置传统路线,但失败了。

通过某些配置,我无法使 Api 工作,而对于其他一些配置,我在启动过程中遇到此异常:

InvalidOperationException: Action 'ApiIsWorking' does not have an attribute route. Action methods on controllers annotated with ApiControllerAttribute must be attribute routed.

如何将 startup.cs 设置为自动映射 Controller 及其类名称和操作及其方法名称?

谢谢!

一些代码:

startup.cs

...
services.AddControllers()
...

app.UseHttpsRedirection()
.UseRouting()
.UseAuthentication()
.UseEndpoints(endpoints => ?? )
.UseCoreHttpContext()
.UseServerConfiguration();

Controller .cs

[ApiController]
public class BaseAPI : ControllerBase
{
[HttpGet]
public string ApiIsWorking()
{
return "API is working!";
}
}

解决方案:

As Reza Aghaei says in the solution ,错误是添加 ApiController 属性。删除它后,命令 UseEndpoints 开始工作。

我的错误是添加了能够识别哪些类应该通过 API 公开的属性。没有必要,因为 UseEndpoints 仅映射从 ControllerBase 继承的类。

警告:

1) Conventional Routing require [FromBody] attribute in actions params.

2) 我突出显示Zinov's response关于 .NET Core 中 Swashbuckle 的传统路由问题

最佳答案

要为 Controller 和操作使用常规路由,您需要从 Controller 和操作中删除 [ApiController] 属性和 [Route] 属性,并在 UseEndpoints

documentations 中已经提到过:

The [ApiController] attribute makes attribute routing a requirement.

Actions are inaccessible via conventional routes defined by UseEndpoints, UseMvc, or UseMvcWithDefaultRoute in Startup.Configure.

示例

这是我启动时的工作设置:

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}

还有一个示例 API Controller :

public class ValuesController : ControllerBase
{
// values/getall
[HttpGet]
public IEnumerable<string> GetAll()
{
return new string[] { "value1", "value2" };
}

// values/getitem/1
[HttpGet]
public string GetItem(int id)
{
return "value";
}
}

关于c# - ASP.NET Core API 中的常规路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60205552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com