在ASP.NET Core 3.1中,API和MVC路由之间的混淆是一个常见的问题,因为它们具有相似的路由设置和行为。以下是一些解决方案和代码示例来解决这个问题:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => options.EnableEndpointRouting = false);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMvcWithDefaultRoute();
}
[ApiController]
[Route("api/[controller]")]
public class ApiController : ControllerBase
{
// API actions
}
[Route("[controller]")]
public class MvcController : Controller
{
// MVC actions
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Conventions.Add(new RoutePrefixConvention("api"));
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMvcWithDefaultRoute();
}
public class RoutePrefixConvention : IApplicationModelConvention
{
private readonly AttributeRouteModel _routePrefix;
public RoutePrefixConvention(string prefix)
{
_routePrefix = new AttributeRouteModel(new RouteAttribute(prefix));
}
public void Apply(ApplicationModel application)
{
foreach (var controller in application.Controllers)
{
if (!controller.ControllerName.Contains("Api"))
{
continue; // Skip MVC controllers
}
var routeSelector = controller.Selectors.FirstOrDefault();
if (routeSelector != null)
{
routeSelector.AttributeRouteModel =
AttributeRouteModel.CombineAttributeRouteModel(_routePrefix, routeSelector.AttributeRouteModel);
}
}
}
}
通过以上解决方案和代码示例,你可以清晰地区分API和MVC路由,并避免它们之间的混淆。