addon365 / b1ke-sh0wr00m

Apache License 2.0
0 stars 0 forks source link

Publish Angular app along with Wep Api in Azure #22

Closed sathishid closed 5 years ago

sathishid commented 5 years ago

Need to investigate to publish Angular with Web Api in Azure.

sathishid commented 5 years ago

Investigating to publish angular app with Api in Azure takes more time, Following issue occurred and trying to resolve the issue with the following mentioned ways.

Issue Occurred:

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.

Tried Following ways: https://github.com/aspnet/JavaScriptServices/issues/1729 https://github.com/aspnet/JavaScriptServices/issues/1514 https://medium.com/@levifuller/building-an-angular-application-with-asp-net-core-in-visual-studio-2017-visualized-f4b163830eaa

christophedemey commented 5 years ago

Hi

I am having this issue today also, let me know if i can help or how i can resolve this. I started from visual studio dotnet core 2.1 angular template. Then i deleted ClientApp dir, and ng new ClientApp it.

Thanks

sathishid commented 5 years ago

Hi christophedemey,

Resolved this issue by comparing existing Angular Asp net core template, I did following code changes. In csproj file:

<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
    <TypeScriptToolsVersion>Latest</TypeScriptToolsVersion>
    <IsPackable>false</IsPackable>
    <SpaRoot>ClientApp\</SpaRoot>
    <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>

    <!-- Set this to true if you enable server-side prerendering -->
    <BuildServerSideRenderer>false</BuildServerSideRenderer>
    <UserSecretsId>baa2f579-d2a7-4eb4-89fb-1c171b2e2482</UserSecretsId>
    <TypeScriptToolsVersion>3.0</TypeScriptToolsVersion>

   <ItemGroup>
    <TypeScriptCompile Include="App\src\app\models\user.ts" />
    <TypeScriptCompile Include="App\src\app\utils\AppContants.ts" />
    <!-- Don't publish the SPA source files, but do show them in the project files list -->
    <Content Remove="$(SpaRoot)**" />
    <None Include="$(SpaRoot)**" Exclude="$(SpaRoot)node_modules\**" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Properties\PublishProfiles\" />
  </ItemGroup>

  <Target Name="DebugEnsureNodeEnv" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('$(SpaRoot)node_modules') ">
    <!-- Ensure Node.js is installed -->
    <Exec Command="node --version" ContinueOnError="true">
      <Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
    </Exec>
    <Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project. To continue, please install Node.js from https://nodejs.org/, and then restart your command prompt or IDE." />
    <Message Importance="high" Text="Restoring dependencies using 'npm'. This may take several minutes..." />
    <Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
  </Target>

  <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="ng 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>

In Startup.cs

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

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

In Angular Package.json

         "options": {
            "outputPath": "dist",

Now issue is invoking REST Api from post man returning Angular page (working locally by not published), do you have idea on this?

Thanks, Sathish

sathishid commented 5 years ago

Rest API working but seeding not working, investigating on this.

sathishid commented 5 years ago

Issue is in Seeding not in Rest API invocation.

Commit Details: 80bd90629fca066a8e988ba0122e9cd8d284af68

sathishid commented 5 years ago

Seeding also working now.