J'ai développé une application asp.net core 2.0 MVC avec l'ajout d'une application angulaire 6 frontale. Ils existent tous les deux dans la même structure de projet. L'application principale asp.net agit en tant qu'API pour l'application Angular 6 côté client.
Je les ai développés côte à côte et j'ai inclus les segments de code suivants dans le fichier Startup.cs pour permettre le développement pendant l'exécution des deux applications:
ConfigureServices
services.AddSpaStaticFiles(configuration => {
configuration.RootPath = "ClientApp/dist";
});
Configure
app.UseSpa(spa => {
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment()) {
spa.UseAngularCliServer(npmScript: "start");
}
});
La structure du projet pour l'application Angular se trouve dans ClientApp.
Je sais que je souhaite déployer ce projet sur IIS. Je m'éloigne donc de l'environnement de développement et je sais que la ligne de code: spa.UseAngularCliServer(npmScript: "start");
ne sera pas exécutée.
Lorsque je publie le projet via Visual Studio et que je le déplace dans le dossier inetpub comme je le ferais pour d'autres applications, les pages que j'ai développées dans l'application Angular 6 ne seront pas utilisées. Je reçois une erreur de serveur interne 500 lors de la tentative d'accès à une page telle que/Home que j'ai définie dans le RoutingModule de l'application Angular 6.
Je suppose que c'est parce que je dois créer l'application Angular (ce que je peux faire avec ng build --prod
) et ajouter les fichiers JS compilés à une page HTML. Mais je ne sais pas comment s'y prendre. Si quelqu'un a des liens vers des pages Web pertinentes, cela serait grandement apprécié. Ou si vous pouvez fournir des informations qui pourraient être très utiles.
Mise à jour n ° 1:
Dans le fichier Startup.cs, j'ai rendu app.UseDeveloperExceptionPage () disponible pour l'exécution en mode de production.
Au lieu d’une page d’erreur 500 sur le serveur interne, une exception s’est produite: Le middleware de page par défaut du SPA n’a pas pu renvoyer la page par défaut '/index.html' car elle n’a pas été trouvée et aucun autre middleware n’a traité la demande.
J'ai également remarqué que le dossier ClientApp/dist n'était pas présent après la publication. J'ai construit manuellement ClientApp et l'a ajouté à l'application dans inetpub. Maintenant, j'obtiens l'erreur dans la console:
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 <
Vous devez utiliser ce code pour ASP.NET Core 2.0 , pas ce que vous utilisez. Mon application est publiée en utilisant cette approche.
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
});
Vous devez avoir une action dans votre HomeController qui renvoie une vue . Code pour la vue est
<app asp-prerender-module="ClientApp/dist/main-server">Loading...</app>
J'ai joué avec le même problème. Mais a été capable de le faire fonctionner avec de l'aide avec quelqu'un qui est plus au courant de IIS que moi-même.
Je vais décrire mes étapes à suivre pour exécuter une application Angular 6 .NET Core 2.1 sur IIS.
Commencez par supprimer services.AddSpaStaticFiles(configuration => {
configuration.RootPath = "ClientApp/dist";
});
de votre Startup.cs
ng build --prod
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