При публикации углового проекта .netcore выдается «Промежуточное ПО страницы SPA по умолчанию не может вернуть index.html», работает в режиме отладки. - PullRequest
0 голосов
/ 07 ноября 2019

Мы унаследовали небольшое базовое приложение .net с угловым внешним интерфейсом 8 и внутренним веб-интерфейсом. Когда я получил файлы, они были двумя отдельными проектами, но чтобы они оставались похожими на остальные наши проекты и чтобы облегчить наши развертывания, мы хотели объединить их в одно визуальное студийное решение / проект.

IЯ принес файлы в Visual Studio и сделал разные вещи, чтобы попытаться заставить проект работать. Я был на этом около дня, поэтому я не мог полностью сказать вам, что я пытался. В настоящее время все работает, когда я отлаживаю, никаких проблем, все работает нормально. Однако, если я публикую файлы, я сталкиваюсь с проблемой, при которой загрузка веб-сайта выдает следующую ошибку:

 [Error] An unhandled exception has occurred while executing the request.
System.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.
Your application is running in Production mode, so make sure it has been published, or that you have built your SPA manually. Alternatively you may wish to switch to the Development environment.

   at Microsoft.AspNetCore.SpaServices.SpaDefaultPageMiddleware.<>c__DisplayClass0_0.<Attach>b__1(HttpContext context, Func`1 next)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext context)

При просмотре опубликованных файлов файлы ядра .net и веб-API выглядят правильно. Однако внутри папки ClientApp файлы выглядят некорректно (по сравнению с другим проектом Angular 8 и WebAPI).

Во-первых, мне совершенно не хватает папки dist. Я полагаю, что причина этого в том, что файлы dist не генерируются, потому что, если я сравниваю два решения Visual Studio (и пути их проектов, а не путь публикации);рабочий проект имеет такие файлы, как index.html, runtime.xxx.js и main.xxx.js. Неработающий проект не имеет этих файлов, вместо этого он просто имеет папку out-tsc, которая содержит то, что выглядит как копия машинописных файлов, скомпилированных в javascript.

Во-вторых, опубликованная папка ClientApp нерабочего проекта содержит angular.json, tsconfig.json и пару других файлов JSON, которых нет в опубликованных файлах рабочих проектов.

Похоже, это связано с публикацией или созданием файлов машинописи, но я не уверен, как ее решить.

Несколько вещей, которые могут добавить ценные сведения:

часть файла startup.cs имеет следующее:

services.AddSpaStaticFiles(configuration =>
{
   configuration.RootPath = "ClientApp/dist";
});

// *snip* 

app.UseSpaStaticFiles();

app.UseSpa(spa => {
    spa.Options.SourcePath = "ClientApp";
    if (env.IsDevelopment())
    {
        spa.UseAngularCliServer(npmScript: "start");
    }
});

часть angular.json:

  "outputPath": "dist"

full tsconfig.json

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "module": "esnext",
    "moduleResolution": "node",
    "importHelpers": true,
    "target": "es2015",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "dom"
    ]
  },
  "angularCompilerOptions": {
    "fullTemplateTypeCheck": true,
    "strictInjectionParameters": true
  }
}

1 Ответ

0 голосов
/ 07 ноября 2019

Поэтому, сравнивая мои файлы csproj построчно, я в конце концов добавил следующее к нерабочему csproj. Это тогда жаловалось с другой незначительной ошибкой (которая была фактически ошибкой кода), и затем все начало работать правильно.

  <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
    <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
    <Exec WorkingDirectory="$(SpaRoot)" Command="npm run build -- --prod" />
    <Exec WorkingDirectory="$(SpaRoot)" Command="npm run build:ssr -- --prod" Condition=" '$(BuildServerSideRenderer)' == 'true' " />

    <!-- Include the newly-built files in the publish output -->
    <ItemGroup>
      <DistFiles Include="$(SpaRoot)dist\**; $(SpaRoot)dist-server\**" />
      <DistFiles Include="$(SpaRoot)node_modules\**" Condition="'$(BuildServerSideRenderer)' == 'true'" />
      <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
        <RelativePath>%(DistFiles.Identity)</RelativePath>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      </ResolvedFileToPublish>
    </ItemGroup>
  </Target>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...