.NET core 2.1 Web API 是不是支持基于约定的路由?

Posted

技术标签:

【中文标题】.NET core 2.1 Web API 是不是支持基于约定的路由?【英文标题】:Does .NET core 2.1 web API support convention based routing?.NET core 2.1 Web API 是否支持基于约定的路由? 【发布时间】:2020-01-03 22:44:33 【问题描述】:

我是 Web API 和 .net 核心的新手,我的任务是开发 API。

所以我创建了一个默认的 Web API(框架:.NET Core 2.1)并尝试添加路由映射,但出现错误。

有人可以帮我安排路线。

注意:不能使用基于属性的路由,需要根据 MVC 中的约定处理路由

我的启动程序:

public class Startup

    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    

    public IConfiguration Configuration  get; 

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        
        else
        
            app.UseHsts();
        

        //app.UseHttpsRedirection();
        app.UseMvc(routes =>
        
        routes.MapRoute(
            name: "default",
            template: "controller/action/id?",
            defaults: new  controller = "Values", action = "dummyaction" );
        );
    

这是我得到的错误:

InvalidOperationException:操作“myproject.Controllers.ValuesController.dummyaction (myproject)”没有属性路由。使用 ApiControllerAttribute 注解的控制器上的操作方法必须是属性路由。

【问题讨论】:

为什么不能使用属性路由?无论如何,没有基于约定的路由,例如具有GetPostPutDelete 等操作并让这些操作自动响应这些 HTTP 方法。 Chris Pratt 因此,如果我将所有操作方法替换为类似“dummyaction”的名称并在地图路线中,如果我将默认操作设置为“dummyaction”,我将能够执行基于约定的路由 我不确定你在说什么。 【参考方案1】:

我是怎么做到的

即使在使用地图路由后,我仍然收到有关基于属性的路由的错误

app.UseMvc(routes =>
    
    routes.MapRoute(
        name: "default",
        template: "controller/action/id?",
        defaults: new  controller = "Values", action = "dummyaction" );
    );

所以在错误中你能看到这一行“控制器上的操作方法 用 ApiControllerAttribute 注释的必须是属性路由。”

现在在我的控制器中,我通过删除我能够执行基于约定的路由来使用这个特定的注释/属性“[ApiController]”。

另外,我已经更新了如下路线

app.UseMvc(routes =>

     routes.MapRoute(
            name: "api",
            template: "api/controller=Values/action=gogogo/id?");
 );

参考:

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.2#mixed-routing-attribute-routing-vs-conventional-routing section(混合路由:属性路由 vs 常规路由)

asp.net core web api center routing

【讨论】:

【参考方案2】:

您可以使用此示例进行操作

namespace TodoApi.Controllers

    [Route("api/[controller]")]
    [ApiController]
    public class TodoController : Controller
   
      [HttpGet("id")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)

//do here
    


更多信息请关注link

【讨论】:

我的要求是不要将单个路由添加到控制器和操作,而是客户端想要一个全局路由。注意:我将使用 studentlist、editstudent 等名称,而不是 get、post、put 操作名称

以上是关于.NET core 2.1 Web API 是不是支持基于约定的路由?的主要内容,如果未能解决你的问题,请参考以下文章

基于 .NET Framework 的 .NET Core 2.1 Web API 的授权问题

在 ASP.NET Core 2.1 Web API 中实现分页

在 Web Api Controller (.Net Core 2.1) 中获取声明和订阅

在 ASP .NET Core 2.1 Web Api 中启用 CORS

如何使用 fetch 将 FormData 从 javascript 发送到 ASP.NET Core 2.1 Web API

ASP.NET Core 2.1 MVC - 无法设置从 Web api 响应接收到的 cookie