web-dev-qa-db-fra.com

Déploiement et hébergement d'ASP.NET Core 2.0 Web App

Environnement

Mon environnement de développement local est un PC Windows 10 utilisant Visual Studio 2017.

REMARQUE: Pour le moment, je ne peux accéder à mon serveur Web que via cpanel. Cependant, si le fournisseur d'hébergement ne peut pas fournir une prise en charge adéquate pour une application ASP.NET Core 2.0, je vais envisager de passer à un serveur dédié, où j'ai un accès complet au serveur et à IIS.

Mon exigence/projet

J'ai développé une application Web ASP.NET qui cible le framework .NET Core 2.0, et l'application fonctionne correctement avec localhost et IIS express.

Maintenant que l'application est terminée, je dois déployer et héberger, ce qui semble être une tâche intimidante qui ajoutera des années à mon âge en quelques jours et semaines.

J'ai lu sur des utilisateurs qui ont pataugé à travers une multitude d'articles, de blogs, de documents MS, de stackoverflow, etc. essayant (souvent sans succès) de se déployer sur Intranet et Internet. Maintenant, j'ai l'impression que la publication et le déploiement avec .net core semblent être une masse totale de confusion.

Mon site Web actuel a été développé par une partie externe - un site Wordpress utilisant PHP. Je veux remplacer ce site par mon application Web ASP.NET Core2.0.

La racine de mon site actuel est "httpdocs", où j'ai quelques sous-dossiers avec des fichiers image que je dois référencer à partir d'autres applications. Je ne sais pas si ceux-ci peuvent rester tels quels ou si je dois les migrer vers un nouveau dossier où réside l'application Web ASP.NET. Je n'ai pas accès directement au serveur, je ne peux y accéder que via cpanel.

L'application nécessite https, et ci-dessous, j'ai inclus mes fichiers Startup.cs et Program.cs.

J'ai décrit les étapes et les considérations qui, selon moi, sont impliquées dans le déploiement et l'hébergement. Est-ce que n'importe qui qui a eu une expérience antérieure avec ceci peut m'aider avec mes questions, ou me conseiller de quelque chose que j'ai manqué ou d'autres choses que je devrais aborder?

Startup.cs

public class Startup
{
    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)
    {
        try
        {
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
                {
                    options.ExpireTimeSpan = new TimeSpan(90, 0, 0, 0);
                    options.LoginPath = new PathString("/Home/Index/");
                    options.AccessDeniedPath = new PathString("/Home/Index/");
                    options.LogoutPath = new PathString("/Home/Index/");
                    options.Validate();
                });

            services.AddMvc();
            services.AddAntiforgery();
            services.Configure<MvcOptions>(options =>
            {
                options.Filters.Add(new RequireHttpsAttribute());
            });
        }
        catch (Exception ex)
        {
            gFunc.ProcessError(ex);
        }
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline
// I've added a StaticFiles option that aims to make a directory called "SamadhiFiles" publically available
// so that I can use "http://mysite.net.au/samadhifiles/myPic.png
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        try
        {
            app.UseMvc();
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "SamadhiFiles")),
                RequestPath = "/SamadhiFiles"
            });
            app.UseAuthentication();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
                app.UseStatusCodePages();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

    // this code is to enable redirection of http to https
            var options = new RewriteOptions().AddRedirectToHttps();
            app.UseRewriter(options);

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
        catch (Exception ex)
        {
            gFunc.ProcessError(ex);
        }
    }
}

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()            
            .UseIISIntegration()
            .UseKestrel()
            .Build();
}

UseIISIntegration () indique à ASP.NET que IIS fonctionnera comme un proxy inverse devant Kestrel. Cela spécifie également certains paramètres autour desquels Kestrel doit écouter, transmettre les en-têtes et d'autres détails. UseKestrel () enregistre l'interface IServer pour Kestrel en tant que serveur qui sera utilisé pour héberger l'application.

Je suis sûr que si je dois changer quoi que ce soit ici, ou simplement utiliser les options de sourd.

J'ai lu: Microsoft recommande d'utiliser IIS avec tout site public pour l'hébergement principal ASP.NET. IIS fournit des niveaux supplémentaires de configurabilité, de gestion, de sécurité, la journalisation et bien d'autres choses. L'un des grands avantages de l'utilisation de IIS est la gestion des processus. IIS démarrera automatiquement votre application et la redémarrera éventuellement si un Si vous exécutiez votre application ASP.NET Core en tant que service Windows ou application console, vous ne disposeriez pas de ce filet de sécurité pour démarrer et surveiller le processus pour vous.

launchSettings.json

Dois-je apporter des modifications au contenu de ce fichier avant de le publier? Ou cela change-t-il automatiquement lors de la publication de l'application dans un dossier? Par exemple, dois-je changer l'ENVIRONNEMENT en "Production", ou l'applicationUrl en mon domaine de site Web?

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "https://localhost:44301/",
      "sslPort": 44376
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "CanvasWeb": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:61900/"
    }
  }
}

web.config (pour ASP.NET Core)

Le fichier web.config doit définir comment IIS démarre mon processus ASP.NET Core. Par exemple, je souhaite activer la journalisation des sorties en définissant stdoutLogEnabled = true et je peux également vouloir modifier le journal emplacement de sortie tel que configuré dans stdoutLogFile.

La configuration IIS est influencée par la section de web.config pour les fonctionnalités IIS qui s'appliquent à une configuration de proxy inverse.

Dans mon projet ASP.NET Core2, il n'y a actuellement aucun fichier "web.config". Ce fichier apparaîtra-t-il lorsque je publierai mon application?

Publier dans un dossier

Lors du déploiement à partir de Visual Studio, l'étape de publication dotnet se produit automatiquement avant que les fichiers ne soient copiés vers la destination de déploiement.

Le dossier de publication contient les fichiers .exe et .dll pour l'application, ses dépendances et éventuellement le runtime .NET. En plus des fichiers .exe et .dll, le dossier de publication d'une application ASP.NET Core contient généralement des fichiers de configuration, des actifs statiques et des vues MVC.

Une application .NET Core peut être publiée en tant qu'application autonome ou dépendante du framework. Si l'application est autonome, les fichiers .dll qui contiennent le runtime .NET sont inclus dans le dossier de publication. Si l'application dépend du framework, les fichiers d'exécution .NET ne sont pas inclus car l'application a une référence à une version de .NET installée sur le serveur.

Comme j'installe pour IIS sur le serveur Windows, je pense que je devrais utiliser le modèle de déploiement par défaut, qui dépend du framework.

Gestionnaire de processus

Une application ASP.NET Core est une application console qui doit être démarrée au démarrage d'un serveur et redémarrée en cas de panne. Pour automatiser les démarrages et redémarrages, un gestionnaire de processus est requis. Je sais que je pourrais utiliser Apache sous Linux, mais dans ce cas, je dois utiliser IIS car mon site actuel est un serveur Windows.

Configuration d'un proxy inverse

Un scénario qui nécessite un proxy inverse est lorsque vous avez plusieurs applications qui partagent la même IP et le même port s'exécutant sur un seul serveur. Cela ne fonctionne pas directement avec Kestrel car Kestrel ne prend pas en charge le partage de la même IP et du même port entre plusieurs processus. Lorsque vous configurez Kestrel pour écouter sur un port, il gère tout le trafic pour ce port indépendamment de l'en-tête de l'hôte. Un proxy inverse qui peut partager des ports doit ensuite transmettre à Kestrel sur une IP et un port uniques.

Selon MS, il existe d'autres raisons d'utiliser un serveur proxy inverse. Par exemple, il simplifie l'équilibrage de charge et la configuration SSL. Seul votre serveur proxy inverse nécessite un certificat SSL, et ce serveur peut communiquer avec vos serveurs d'applications sur le réseau interne à l'aide de HTTP simple.

Installer le pack d'hébergement de serveur Windows .NET Core

J'ai lu qu'avant de déployer mon application, je dois installer le pack d'hébergement .NET Core pour IIS sur la machine d'hébergement. Cela installera le runtime .NET Core, les bibliothèques et le Module ASP.NET Core pour IIS. Après l'avoir installé, vous devrez peut-être effectuer un "net stop was/y" et "net start w3svc" pour vous assurer que toutes les modifications sont prises en compte pour IIS.

Je ne peux accéder à mon serveur Web que via cpanel, donc je pense que mon hébergeur devra le faire.

Certificat SSL

Parce que j'utilise https, je pense que je devrai acheter un certificat SSL et l'installer dans IIS.

Configuration IIS - Créer une application dans IIS

Je ne peux accéder à mon serveur Web que via cpanel, donc je pense que cela devra également être fait par mon hébergeur.

  1. Créez un nouveau IIS pool d'applications. Vous souhaiterez en créer un sous la version .NET CLR de "No Managed Code". Étant donné que IIS fonctionne uniquement comme proxy inverse, il n'exécute en fait aucun code .NET.
  2. Créez votre nouvelle application sous votre site IIS existant, ou créez un nouveau site IIS. Dans les deux cas, vous souhaiterez choisir votre nouveau IIS Pool d'applications et pointez-le vers le dossier dans lequel vous avez copié vos fichiers de sortie de publication ASP.NET.
15
Ross Kelly

J'ai jeté un œil à Nginx, mais je n'ai pas pu obtenir le support dont j'avais besoin et je n'ai aucune expérience Linux.

J'ai finalement fini par changer mon hébergement pour un nouveau fournisseur (hébergement partagé sur un VPS), mais c'était toujours un cauchemar d'obtenir un bon support.

Il s'est avéré que je n'ai pas eu à modifier le fichier launchSettings.json.

Mon fichier web.config s'est terminé comme suit:

    <?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=".\MyApplication.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>
<!--ProjectGuid: 4833e7c3-6fb8-4b3c-961f-f026b12af306-->

Mon fichier . Csproj est le suivant:

    <Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Aspose.Words" Version="18.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.3" />
    <PackageReference Include="System.ServiceModel.Duplex" Version="4.4.0" />
    <PackageReference Include="System.ServiceModel.Http" Version="4.4.0" />
    <PackageReference Include="System.ServiceModel.NetTcp" Version="4.4.0" />
    <PackageReference Include="System.ServiceModel.Security" Version="4.4.0" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" />
  </ItemGroup>

  <ItemGroup>
    <WCFMetadata Include="Connected Services" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="wwwroot\CVFiles\" />
    <Folder Include="wwwroot\icons\" />
    <Folder Include="wwwroot\PictureFiles\" />
    <Folder Include="wwwroot\resources\" />
  </ItemGroup>

</Project>
3
Ross Kelly