ASP.NET Core 2.2 MVC MapRoute 项目到 ASP.NET 3.0 端点 MapAreaControllerRoute “找不到此本地主机页面”

Posted

技术标签:

【中文标题】ASP.NET Core 2.2 MVC MapRoute 项目到 ASP.NET 3.0 端点 MapAreaControllerRoute “找不到此本地主机页面”【英文标题】:ASP.NET Core 2.2 MVC MapRoute project to ASP.NET 3.0 endpoints MapAreaControllerRoute "This localhost page can't be found" 【发布时间】:2020-05-31 15:31:42 【问题描述】:

我们正在将我们的应用程序从 ASP.NET Core 2.2 项目升级到使用端点路由的 ASP.NET 3.0。我被困在“未找到网页”的以下问题上。我相信我对 ASP.NET 3.0 应用了正确的更改,并且我尝试了各种更改。

这里是 asp.net core 2.2 代码区

startup.cs


        public void ConfigureServices(IServiceCollection services)
        ......
            //Asp.net Core 2.2
            services.AddRouting();
            //AddMvc
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);


            .AddViewLocalization(
            LanguageViewLocationExpanderFormat.Suffix, options =>  options.ResourcesPath = "Areas\\Resources"; )
            .AddDataAnnotationsLocalization();

       public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        .....
            app.UseMvc(routes =>
            
                routes.MapRoute(
                    name: "default",
                    template: "controller=Home/action=Index/id?");
                //
                routes.MapRoute(name: "Navigation", template: "Navigation/controller/action/id?";

我们用 :

装饰我们的控制器
    namespace Areas.Navigation.Controllers
    
        [Area("Navigation")]
        [Route("[area]/[controller]/[action]")]

        public class NavigationHomeController : Controller
       .......

这是我们更改的 asp.net 3.0 代码区域

startup.cs

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        

           app.UseEndpoints(endpoints =>
            
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "controller=Home/action=Index/id?");
                //Endpoints Start
                endpoints.MapAreaControllerRoute(areaName: "Navigation", name: "Navigation", pattern: "Navigation/controller/action/id?");

我的 Razor 页面包括以下内容:

    <a asp-area="Navigation" asp-controller="NavigationHome" asp-action="IndexAsync">Navigation</a>

我遇到了以下问题

【问题讨论】:

【参考方案1】:

对此的解决方案是查看“从 ASP.NET Core 2.2 迁移到 3.0”。最初已完成此操作,但忽略了本文档中的建议。

我的项目包含 130 个其他子项目。为了解决我的问题,我做了以下事情:

    Review "Migrate from ASP.NET Core 2.2 to 3.0" again.

    在 Startup 中删除所有 Core 2.2 对 MapRoute 的引用。例如:

    routes.MapRoute(name: "Navigation", template:     
                    Navigation/controller/action/id?";
    

    使用来自"How to define an endpoint Route to multiple Areas"的建议 在 Startup 中,代码如下所示:

        app.UseEndpoints(endpoints =>
        
            endpoints.MapAreaControllerRoute(
                name: "areas",
                areaName: "areas",
                pattern: "area/controller/action/id?"
                );
    
            endpoints.MapControllerRoute(
            name: "default",
            pattern: "controller=Home/action=Index/id?"););
    

    最后一个关键项目,直到我们修复和更新我们的代码。 “从控制器操作名称中删除异步后缀”

    services.AddMvc(options =>options.SuppressAsyncSuffixInActionNames = false);
    

    这是 "Migrate from ASP.NET Core 2.2 to 3.0" 中描述的 Startup 中遗漏的小细节

    进行更改后,应用程序按预期工作。

【讨论】:

【参考方案2】:

通过使用Route 属性装饰您的控制器

[Area("Navigation")]
[Route("[area]/[controller]/[action]")] //<-- attribute routing
public class NavigationHomeController : Controller 
    //...

控制器现在使用属性路由,而不是基于约定的路由。

但是,您没有在配置中启用属性路由。

在以下示例中:

MapControllers 增加了对属性路由控制器的支持。 MapAreaControllerRoute 为区域内的控制器添加常规路线。 MapControllerRoute 为控制器添加了常规路由。
//...

app.UseEndpoints(endpoints => 
    //Attribute routing
    endpoints.MapControllers();

    //Area convention-based routing
    endpoints.MapAreaControllerRoute(
        areaName: "Navigation", 
        name: "Navigation", 
        pattern: "Navigation/controller/action/id?");

    //Convention-based routing
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "controller=Home/action=Index/id?");
);

//...

这样做是为了避免在将请求与已注册路由匹配时发生路由冲突。

在处理基于约定的路由时,注册顺序也会影响路由表如何解释请求。

因此,请确保在更一般的路线之前注册特定路线。区域也应该在一般路线之前注册。

【讨论】:

您的回答并没有完全解决我们的问题,但它帮助我们找到了解决方案。我会为此赏金给你。

以上是关于ASP.NET Core 2.2 MVC MapRoute 项目到 ASP.NET 3.0 端点 MapAreaControllerRoute “找不到此本地主机页面”的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Angular 9 SPA 项目和 ASP.NET Core 2.2 MVC 项目组合成一个 Visual Studio 2017 解决方案?

ASP.NET Core MVC 查看组件搜索路径

如何在 ASP.NET Core 2.2 中实现标识

如何在启用 ASP.NET Core 2.2 EndpointRouting 的情况下使用 RouteDataRequestCultureProvider?

JWT 身份验证 ASP.NET Core MVC 应用程序

ASP.NET Core 2.2 Razor 页面中的自定义路由