Ric*_*ugh 3 asp.net-web-api asp.net-web-api-routing asp.net-core
在Startup.cs我添加api/到我的路线模式的开始。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "api/{controller}/{action=Index}/{id?}");
});
Run Code Online (Sandbox Code Playgroud)
但它没有做任何事情:旧的 URL 继续工作,并且以 return 404 开头的 URL 继续工作。/api这没有任何意义!
如何让我的 API 在 下提供服务/api?
ASP.NET Core 3.0 中的全局路由前缀
创建自定义 MvcOptionsExtensions
public static class MvcOptionsExtensions
{
public static void UseCentralRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute)
{
opts.Conventions.Insert(0, new RouteConvention(routeAttribute));
}
}
public class RouteConvention : IApplicationModelConvention
{
private readonly AttributeRouteModel _centralPrefix;
public RouteConvention(IRouteTemplateProvider routeTemplateProvider)
{
_centralPrefix = new AttributeRouteModel(routeTemplateProvider);
}
public void Apply(ApplicationModel application)
{
foreach (var controller in application.Controllers)
{
var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList();
if (matchedSelectors.Any())
{
foreach (var selectorModel in matchedSelectors)
{
selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix,
selectorModel.AttributeRouteModel);
}
}
var unmatchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel == null).ToList();
if (unmatchedSelectors.Any())
{
foreach (var selectorModel in unmatchedSelectors)
{
selectorModel.AttributeRouteModel = _centralPrefix;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Startup.cs中的代码
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(opt => {
opt.UseCentralRoutePrefix(new RouteAttribute("api"));
;
});
}
Run Code Online (Sandbox Code Playgroud)
结果检验
| 归档时间: |
|
| 查看次数: |
2575 次 |
| 最近记录: |