我已根据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
文件。
答案 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中的UseEndpoints
,UseMvc
或UseMvcWithDefaultRoute
定义的常规路由无法访问操作。
如果要对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