.Net Core 2 和 AngularJS SPA 不工作

我一直在将一个项目从 .NET Framework 迁移到 .NET Core 2,这个过程比预期的要顺利,但是当我认为我已经克服了最困难的挑战时,我终生无法获得 SPA 方面上班。

当我启动应用程序时,只要我转到根目录 ( https://localhost:5001 ) ,它就可以正常工作,并且我可以使用 Angular 路由进行导航。但是,如果我尝试通过路由加载页面,例如。https://localhost:5001/login,我得到一个通用的Chrome 404“找不到本地主机页面”。

index.html在目录中MyApp/Pages/,我的客户端代码在MyApp/wwwroot/app/. 当移动index.htmlwwwroot文件夹时,我什么也得不到。

在 My 中Startup.cs,这是我的设置方式:

public class Startup

{

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    {

        if (env.IsDevelopment())

        {

            app.UseDeveloperExceptionPage();

        }

        else

        {

            app.UseExceptionHandler("/Error");

            app.UseHsts();

        } 


        app.UseHttpsRedirection();

        app.UseStaticFiles();


        var defaultFileOptions = new DefaultFilesOptions();

        defaultFileOptions.DefaultFileNames.Clear();

        defaultFileOptions.DefaultFileNames.Add("/index.html");

        app.UseDefaultFiles(defaultFileOptions);

        app.Use(async (context, next) =>

        {

            await next();

            if (context.Response.StatusCode == 404 &&

                !Path.HasExtension(context.Request.Path.Value))

            {

                context.Request.Path = "/index.html";

                context.Response.StatusCode = 200;

                await next();

            }

        });


        app.UseCookiePolicy();

        app.UseAuthentication();


        app.UseMvc();

    }

}

我尝试了许多指南,但似乎我能找到的大多数指南都非常过时,或者在尝试使用帖子中的方法时,它们是我没有的方法。非常感谢任何帮助,因为我很想完成迁移并继续从事该项目。


拉风的咖菲猫
浏览 188回答 3
3回答

慕桂英4014372

这里的问题是你有一个 SPA,而 Angular 有它自己的路由,但是当你尝试使用像https://localhost:5001/login这样的 URL 时,这条路由是由 MVC 而不是由 Angular 提供的,MVC 会找不到合适的控制器,结果返回 404。你应该做的是返回 index.html 以响应此类请求,以便 Angular 路由可以处理它。你可以看看这篇文章:https://www.toptal.com/angular/angular-5-asp-net-core

慕码人8056858

原来我的问题出在我处理 404 的方式上。我context.Request.Path = "/index.html";在 Startup.cs中做的,但它仍然无法解析 html 文件,所以我让它重定向回根路径:    app.Use(async (context, next) =>    {        await next();        if (context.Response.StatusCode == 404 &&            !Path.HasExtension(context.Request.Path.Value))        {            // This is what I changed. I need to resolve to "/" instead of "/index.html"            context.Request.Path = "/";            context.Response.StatusCode = 200;            await next();        }    });

慕村9548890

使用此代码:public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){    app.UseDeveloperExceptionPage();    app.UseBrowserLink();}else{    app.UseExceptionHandler("/Error");}app.UseStaticFiles();app.UseMvc(routes =>{    routes.MapRoute(        name: "default",        template: "{controller}/{action=Index}/{id?}");});}
打开App,查看更多内容
随时随地看视频慕课网APP