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 “找不到此本地主机页面”的主要内容,如果未能解决你的问题,请参考以下文章