ASP.NET Core 3.0端点路由不适用于默认路由

时间:2019-10-21 14:42:25

标签: c# asp.net-core-3.0

我已根据this page的指南将现有的API项目从2.2迁移到3.0

因此我已删除:

app.UseMvc(options =>
{
    options.MapRoute("Default", "{controller=Default}/{action=Index}/{id?}");
});

并插入:

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

但是不会绑定任何控制器和动作。我通过调用的所有API获得的都是404。

我应该如何调试它?在这里我会错过什么?

更新Startup.cs文件位于另一个程序集中。我们在许多项目中重复使用了集中的Startup.cs文件。

2 个答案:

答案 0 :(得分:2)

来自Attribute routing vs conventional routing

  

通常为服务于浏览器的HTML页面的控制器使用常规路由,为服务于REST API的控制器使用属性路由。

来自Build web APIs with ASP.NET Core: Attribute routing requirement

[ApiController]属性使属性路由成为必需。例如:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

通过Startup.Configure中的UseEndpointsUseMvcUseMvcWithDefaultRoute定义的常规路由无法访问操作。

如果要对Web api使用常规路由,则需要在Web api上禁用属性路由。

启动:

   public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }

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

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

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

Web api控制器:

 //[Route("api/[controller]")]
//[ApiController]
public class DefaultController : ControllerBase
{
    public  ActionResult<string> Index()
    {
        return "value";
    }

    //[HttpGet("{id}")]
    public ActionResult<int> GetById(int id)
    {
        return id;
    }
}

http://localhost:44888/default/getbyid/123可能会请求

答案 1 :(得分:0)

我可以推荐我的解决方案。

像这样创建您的CUSTOM基本控制器。

    [Route("api/[controller]/[action]/{id?}")]
    [ApiController]
    public class CustomBaseController : ControllerBase
    {
    }

并使用CustomBaseController

 public class TestController : CustomBaseController
    {
        public IActionResult Test()
        {
            return Ok($"Test {DateTime.UtcNow}");
        }
    }

Rout` api / Test / test