asp.net-core - ASP.NET Core 3 添加路由前缀
问题描述
在Startup.cs
我添加api/
到我的路线模式的开头。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "api/{controller}/{action=Index}/{id?}");
});
但它什么也没做:旧的 URL 继续工作,以/api
返回 404 开头的 URL。这没有任何意义!
如何让我的 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;
}
}
}
}
}
Startup.cs 中的代码
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(opt => {
opt.UseCentralRoutePrefix(new RouteAttribute("api"));
;
});
}
结果测试
推荐阅读
- php - 在 php 中重定向到带有 $tag 的页面
- express - 如何将对象从 Express 应用程序传递到 Pug 前端?
- r - dplyr 中的 exp 函数变异返回 1
- reactjs - 搜索不会改变背景色
- c# - 是否可以在抽象基类中构造派生类?
- json - 从嵌套的 json 创建数据框
- python - Python 等价于 SetConstant ( Eigen )
- node.js - 目的。
...未找到模块 - ruby-on-rails - Rails 应用程序的终端输出产生双重请求
- google-bigquery - 如何使用 BigQuery ML 显式拆分数据以进行训练和评估?