.NET core 升级后的路由问题
Routing Issues in .NET core After Upgrade
我已将解决方案从 2.2 升级到 3.1。在 2.2 中一切都 运行 顺利。升级后,我遇到了路由问题。
无法路由到解决方案中不同项目的控制器。
对于 2.2,我使用的是
app.UseMvc(routes =>
{
routes.MapRoute(
name: "areaRoute",
template: "{area:exists}/{controller=Home}/{action=Index}");
routes.MapRoute(
name: "default",
template: "{controller=Account}/{action=Login}/{id?}");
});
我尝试将其更改为
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute(
name: "Quote",
areaName: "Quote",
pattern: "Quote/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapControllerRoute("default", "/{action}/{id?}", new { action = "Index", controller = "Home" });
});
但这并没有帮助。我正在加载程序集,但似乎无法使用 3.1 版的 .NET 核心。
var mvcBuilder = services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
foreach (var assemblyPlugin in pluginsInfoList)
{
// Register controller from modules
mvcBuilder.AddApplicationPart(assemblyPlugin.Assembly);
}
mvcBuilder.AddControllersAsServices();
mvcBuilder.AddViewComponentsAsServices();
services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(new SynapseCore.Services.ThemeControl.TenantViewLocationExpander());
options.AreaViewLocationFormats.Add("/Areas/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Areas/{2}/Views/Shared/{0}.cshtml");
});
services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
{
foreach (PluginInfo ioptionPlugin in pluginsInfoList)
{
options.FileProviders.Add(new EmbeddedFileProvider(
ioptionPlugin.Assembly,
baseNamespace: ioptionPlugin.Name.Replace(".dll", "")));
}
});
我收到错误消息,它试图查找该操作,但找不到后跟它查找特定操作的页面列表。这表明它没有查看其他项目的控制器。
现在可以使用了。我添加了以下代码行。
IMvcBuilder mvcBuilder = services.AddRazorPages();
mvcBuilder.AddRazorRuntimeCompilation();
这解决了问题并添加了其他项目的 dll,现在它正在路由到其他项目的控制器。
我已将解决方案从 2.2 升级到 3.1。在 2.2 中一切都 运行 顺利。升级后,我遇到了路由问题。
无法路由到解决方案中不同项目的控制器。
对于 2.2,我使用的是
app.UseMvc(routes =>
{
routes.MapRoute(
name: "areaRoute",
template: "{area:exists}/{controller=Home}/{action=Index}");
routes.MapRoute(
name: "default",
template: "{controller=Account}/{action=Login}/{id?}");
});
我尝试将其更改为
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute(
name: "Quote",
areaName: "Quote",
pattern: "Quote/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapControllerRoute("default", "/{action}/{id?}", new { action = "Index", controller = "Home" });
});
但这并没有帮助。我正在加载程序集,但似乎无法使用 3.1 版的 .NET 核心。
var mvcBuilder = services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
foreach (var assemblyPlugin in pluginsInfoList)
{
// Register controller from modules
mvcBuilder.AddApplicationPart(assemblyPlugin.Assembly);
}
mvcBuilder.AddControllersAsServices();
mvcBuilder.AddViewComponentsAsServices();
services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(new SynapseCore.Services.ThemeControl.TenantViewLocationExpander());
options.AreaViewLocationFormats.Add("/Areas/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Areas/{2}/Views/Shared/{0}.cshtml");
});
services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
{
foreach (PluginInfo ioptionPlugin in pluginsInfoList)
{
options.FileProviders.Add(new EmbeddedFileProvider(
ioptionPlugin.Assembly,
baseNamespace: ioptionPlugin.Name.Replace(".dll", "")));
}
});
我收到错误消息,它试图查找该操作,但找不到后跟它查找特定操作的页面列表。这表明它没有查看其他项目的控制器。
现在可以使用了。我添加了以下代码行。
IMvcBuilder mvcBuilder = services.AddRazorPages(); mvcBuilder.AddRazorRuntimeCompilation();
这解决了问题并添加了其他项目的 dll,现在它正在路由到其他项目的控制器。