SPA默认页面中间件无法返回默认页面

编程入门 行业动态 更新时间:2024-10-28 18:31:38
本文介绍了SPA默认页面中间件无法返回默认页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试构建我的项目,但出现此错误

i'm trying to build my project but i get this error

处理请求时发生未处理的异常. InvalidOperationException:SPA默认页面中间件无法返回默认页面'/index.html',因为找不到默认页面,并且没有其他中间件处理该请求. Microsoft.AspNetCore.SpaServices.SpaDefaultPageMiddleware +<> c__DisplayClass0_0.b__1(HttpContext上下文,下一个Func)

An unhandled exception occurred while processing the request. InvalidOperationException: The SPA default page middleware could not return the default page '/index.html' because it was not found, and no other middleware handled the request. Microsoft.AspNetCore.SpaServices.SpaDefaultPageMiddleware+<>c__DisplayClass0_0.b__1(HttpContext context, Func next)

我已经在各种站点上寻找解决方案,但没有发现任何东西 我发现问题可能是

I have looked for the solution on various sites but I have not found anything I found that the problem can be

//angular.json ... "outputPath":"dist" //Startup.cs ... spa.Options.SourcePath ="ClientApp"

// angular.json ... "outputPath": "dist" // Startup.cs ... spa.Options.SourcePath = "ClientApp"

但不起作用

这是我的代码,如果有人可以帮助我

this is my code if someone can helps me

Startup.cs

Startup.cs

using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.SpaServices.AngularCli; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace MYAPP.WebAPI { public class Startup { private const string corsName = "AllowOrigin"; public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy(corsName, builder => { builder.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); }); services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_2) .AddJsonOptions(options => { options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm'Z'"; }); services.AddSpaStaticFiles(configuration => { configuration.RootPath = "ClientApp"; }); } // 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(); app.UseCors(corsName); } else { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseSpaStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller}/{action=Index}/{id?}"); }); app.UseSpa(spa => { // To learn more about options for serving an Angular SPA from ASP.NET Core, // see go.microsoft/fwlink/?linkid=864501 spa.Options.SourcePath = "ClientApp"; // ************************************** // questa parte serve solo se si decide di creare un progetto unico WebAPI/Angular //if (env.IsDevelopment()) //{ // spa.UseAngularCliServer(npmScript: "start"); //} //************************************** }); } } }

angular.json

angular.json

{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "MYAPP": { "root": "", "sourceRoot": "src", "projectType": "application", "prefix": "app", "schematics": { "@schematics/angular:component": { "styleext": "scss" } }, "architect": { "build": { "builder": "@angular-devkit/build-angular:browser", "options": { "outputPath": "dist", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "src/tsconfig.app.json", "assets": [ "src/favicon.ico", "src/assets" ], "styles": [ "src/styles.scss" ], "scripts": [], "showCircularDependencies": false }, "configurations": { "production": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" } ], "baseHref": "/MYAPP/", "optimization": true, "outputHashing": "all", "sourceMap": false, "extractCss": true, "namedChunks": false, "aot": true, "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, "budgets": [ { "type": "initial", "maximumWarning": "6mb", "maximumError": "7mb" } ] }, "ec": { "sourceMap": true, "extractCss": true }, "hmr": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.hmr.ts" } ] }, "prod-hmr": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod-hmr.ts" } ], "baseHref": "/MYAPP/", "optimization": true, "outputHashing": "all", "sourceMap": false, "extractCss": true, "namedChunks": false, "aot": true, "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, "budgets": [ { "type": "initial", "maximumWarning": "6mb", "maximumError": "7mb" } ] } } }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { "browserTarget": "MYAPP:build" }, "configurations": { "production": { "browserTarget": "MYAPP:build:production" }, "hmr": { "hmr": true, "browserTarget": "MYAPP:build:hmr" }, "ec": { "browserTarget": "MYAPP:build:ec" } } }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { "browserTarget": "MYAPP:build" } }, "test": { "builder": "@angular-devkit/build-angular:karma", "options": { "main": "src/test.ts", "polyfills": "src/polyfills.ts", "tsConfig": "src/tsconfig.spec.json", "karmaConfig": "src/karma.conf.js", "styles": [ "src/styles.scss" ], "scripts": [], "assets": [ "src/favicon.ico", "src/assets" ] } }, "lint": { "builder": "@angular-devkit/build-angular:tslint", "options": { "tsConfig": [ "src/tsconfig.app.json", "src/tsconfig.spec.json" ], "exclude": [ "**/node_modules/**" ] } } } }, "MYAPP-e2e": { "root": "e2e/", "projectType": "application", "prefix": "", "architect": { "e2e": { "builder": "@angular-devkit/build-angular:protractor", "options": { "protractorConfig": "e2e/protractor.conf.js", "devServerTarget": "MYAPP:serve" }, "configurations": { "production": { "devServerTarget": "MYAPP:serve:production" } } }, "lint": { "builder": "@angular-devkit/build-angular:tslint", "options": { "tsConfig": "e2e/tsconfig.e2e.json", "exclude": [ "**/node_modules/**" ] } } } } }, "defaultProject": "MYAPP" }

推荐答案

这困扰了我几个小时,我终于注意到我的应用中有一个愚蠢的错字.就我而言,该错误与服务器端配置(例如spa.Options.SourcePath = "ClientApp"或ClientApp\dist)无关.

This was bothering me for few hours and I finally noticed a silly typo in my app. In my case, the error had nothing to do with the server-side configuration (like spa.Options.SourcePath = "ClientApp" or ClientApp\dist).

这是由于Angular应用程序用来调用控制器方法的API url中出现了斜杠.

This was due to a trailing slash in the API url my Angular application was using to invoke a controller method.

代替

localhost:81 // Correct

我有

localhost:81/ // Trailing slash is not needed.

如果仔细查看浏览器控制台中的错误,您会看到带有两个连续斜杠的路径.

If you look carefully at the error in browser console, you can see the path with two consecutive slashes.

更多推荐

SPA默认页面中间件无法返回默认页面

本文发布于:2023-11-01 07:33:34,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1548676.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:页面   中间件   SPA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!