Angular 6フロントエンドアプリケーションを追加して、asp.netコア2.0 MVCアプリケーションを開発しました。どちらも同じプロジェクト構造に存在します。asp.netコアアプリケーションは、クライアント側Angular 6アプリケーション。
私はそれらを並行して開発しており、Startup.csファイル内に次のコードセグメントを含めて、両方のアプリケーションの実行中に開発できるようにしています。
_ConfigureServices
services.AddSpaStaticFiles(configuration => {
configuration.RootPath = "ClientApp/dist";
});
Configure
app.UseSpa(spa => {
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment()) {
spa.UseAngularCliServer(npmScript: "start");
}
});
_
Angularアプリケーションのプロジェクト構造は、ClientAppにあります。
このプロジェクトをIISに展開したいと思っています。開発環境から離れるので、コード行spa.UseAngularCliServer(npmScript: "start");
は実行されません。
他のアプリケーションの場合と同じように、Visual Studioを介してプロジェクトを公開し、inetpubフォルダーに移動すると、Angular 6アプリケーション内で開発したページが提供されません。 Angular 6アプリケーションのRoutingModule内で定義した/ Homeなどのページにアクセスしようとすると、500内部サーバーエラーが発生します。
Angularアプリケーション(これは_ng build --prod
_を介して実行できます)を構築し、コンパイルされたJSファイルをHTMLページに追加する必要があるためです。しかし、確信が持てません。どうすればよいでしょうか。誰かが関連するWebページへのリンクを高く評価していただければ幸いです。
更新#1:
Startup.csファイル内で、プロダクションモードで実行するときにapp.UseDeveloperExceptionPage()を使用できるようにしました。
500内部サーバーエラーページの代わりに、例外が発生しました:SPAデフォルトページミドルウェアは、デフォルトページ '/index.html'を検出できなかったため、返すことができませんでした。リクエスト
また、発行後にClientApp/distフォルダーが存在しないことにも気付きました。手動でClientAppをビルドし、inetpubのアプリケーションに追加しました。今、私はコンソールにエラーが表示されます:
_runtime.a66f828dca56eeb90e02.js:1 Uncaught SyntaxError: Unexpected token <
polyfills.7a0e6866a34e280f48e7.js:1 Uncaught SyntaxError: Unexpected token <
Request:10 Resource interpreted as Stylesheet but transferred with MIME type text/html: "http://localhost:8080/styles.169e0a841442606822c8.css".
scripts.ee7fed27c36eaa5fa8a9.js:1 Uncaught SyntaxError: Unexpected token <
main.befe6f4d3c1275f2e1b3.js:1 Uncaught SyntaxError: Unexpected token <
_
このコードはASP.NET Core 2.に使用する必要があり、使用しているものではありません。私のアプリケーションは、このアプローチを使用して公開されています。
app.UseMvc(routes =>
{
//Remove this if you don't need it
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "SPAIndex" }); // For SPA
});
Viewを返すアクションをHomeControllerに含める必要があります。ビューのコードは
<app asp-prerender-module="ClientApp/dist/main-server">Loading...</app>
この変更を加えるだけで、製品IISで機能するはずです。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// In production, the Angular files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist/client";
});
}
私はこれと同じ問題をいじっています。しかし、私よりもIIS)に詳しい人の助けを借りて、それを機能させることができました。
Angular 6 .NET Core 2.1アプリをIISで実行するための手順を説明します。
まず、Startup.csからservices.AddSpaStaticFiles(configuration => { configuration.RootPath = "ClientApp/dist"; });
を削除します
ng build --prod
を使用してangularアプリを公開しますdotnet publish -c Release -o Your new directory
を実行します<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\stdout" />
<rewrite>
<rules>
<rule name="AngularApi" stopProcessing="true">
<match url="ControllerName/.*" />
<action type="None" />
</rule>
<rule name="Angular Routes" enabled="true" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="./index.html" />
</rule>
</rules>
</rewrite>
<httpErrors errorMode="Detailed" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/index.html" />
</httpErrors>
</system.webServer>
</configuration>
C:\Projects\ClientLocatorExceptions2\wwwroot\ClientApp
のようになります。Visual Studio 2019はこのためのプロジェクトテンプレートを提供します。スタートページの最初のステップで新しいプロジェクトを選択し、ASP.NET Core Web Application C#を選択し、ソリューション名を入力して、Angularプロジェクトテンプレートを選択します。 .NET Coreまたは.NET Frameworkで実行されているASP.NET Coreに基づいてソリューションを構築できます。