【问题标题】:Conventional Routing in ASP.NET Core APIASP.NET Core API 中的常规路由
【发布时间】:2020-05-29 00:38:43
【问题描述】:

问题:

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

在某些配置下,我无法让 Api 正常工作,而在其他一些配置下,我在启动时遇到此异常:

InvalidOperationException:操作“ApiIsWorking”没有 属性路线。带有注释的控制器上的操作方法 ApiControllerAttribute 必须是属性路由。

如何设置startup.cs 以自动映射控制器及其类名和操作及其方法名?

谢谢!

一些代码:

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 的常规路由问题

【问题讨论】:

  • 要为您的控制器和操作设置常规路由,您需要从控制器中删除[ApiController] 属性并在UseEndpoints 中设置路由。
  • 长话短说,远在千里之外的平台架构师已经为您做出了使用属性路由的设计决策,这是通过使使用传统路由变得令人难以置信的痛苦来强制执行的路由。

标签: c# asp.net-core asp.net-core-webapi asp.net-apicontroller asp.net-core-3.1


【解决方案1】:

编辑:

我试图在我的机器上设置它。当我从控制器中删除 Route 属性时,出现以下错误:

InvalidOperationException:操作 'WebAPISample.Controllers.WeatherForecastController.Index (WebAPISample)' 没有属性路由。 操作方法 使用 ApiControllerAttribute 注释的控制器必须是属性 路由

错误消息本身是说 API 控制器必须使用属性路由。

我知道这不能回答您的问题,但是对于 .NET Core 3 API,这似乎是不可能的。

来自文档:

[ApiController] 属性使属性路由成为一项要求。 例如:

[Route("api/[controller]")] 
[ApiController] 
public class ValuesController : ControllerBase

通过UseMvc 定义的常规路由无法访问操作或 UseMvcWithDefaultRouteStartup.Configure

参考 MSDN 上的this page

【讨论】:

  • 这似乎不可能。 → 有可能,从控制器/动作中删除 [ApiController][Route(...)]attribute 并在 UseEndpoints 中设置路由。以this post 为例。
【解决方案2】:

你试过了吗?

app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

【讨论】:

  • 是的,我在启动时遇到了这个异常:“System.InvalidOperationException: 'Action ApiIsWorking' 没有属性路由。使用 ApiControllerAttribute 注释的控制器上的操作方法必须是属性路由。'”
  • @Paolo crociati,你的问题解决了吗?你能在这里分享你的代码吗?
【解决方案3】:

要为您的控制器和操作设置常规路由,您需要从控制器和操作中删除 [ApiController] 属性和 [Route] 属性,并在 UseEndpoints 中设置路由。

documentations中已经提到:

[ApiController] 属性使属性路由成为一项要求。

无法通过 UseEndpointsUseMvcStartup.Configure 中的 UseMvcWithDefaultRoute 定义的 conventional routes 访问操作。

示例

这是我用于启动的工作设置:

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 控制器:

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";
    }
}

【讨论】:

    【解决方案4】:

    如果您打算在 .net 核心中使用传统路由,这是我的建议。 完成 API 实现后,您将向其中添加一些文档。人们通常使用这个nuget包Swashbuckle.AspNetCore,它实现了OpenAPI(Swagger)的后期标准。但是,当您使用常规路由并希望使用此工具生成文档时,就会出现问题。

    如果您使用常规路由(与属性路由相反),任何控制器以及使用常规路由的控制器上的操作都不会在 ApiExplorer 中表示,这意味着 Swashbuckle 将无法找到这些控制器并生成来自他们的大摇大摆的操作

    欲了解更多信息,请参阅此链接:Swashbuckle 希望这可以为您的 api 文档省去很多麻烦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      相关资源
      最近更新 更多