ASP.NET Core 2.0 Web App部署和托管

Ros*_*lly 15 .net c# asp.net iis asp.net-mvc

环境

我的本地开发环境是使用Visual Studio 2017的Windows 10 PC.

注意:目前我只能通过cpanel访问我的Web服务器.但是,如果托管服务提供商无法为ASP.NET Core 2.0应用程序提供足够的支持,那么我将考虑更改为专用服务器,在那里我可以完全访问服务器和IIS.

我的要求/项目

我一直在开发一个针对.NET Core 2.0框架的ASP.NET Web应用程序,该应用程序可以正常使用localhost和IIS express.

现在应用程序已经完成,我需要部署和托管,这感觉就像一项艰巨的任务,将在几天或几周内增加我的年龄.

我已经阅读过通过大量文章,博客,MS文档,堆栈溢出等等尝试(通常不成功)在Intranet和Internet上部署的用户.现在我觉得使用.net核心发布和部署似乎是一团混乱.

我目前的网站是由外部方开发的 - 一个使用PHP的Wordpress网站.我想用我的ASP.NET Core2.0 Web应用程序替换此站点.

我当前站点的根目录是"httpdocs",其中我有一些子文件夹,其中包含我需要从其他应用程序引用的图像文件.我不确定它们是否可以保持原样,或者我是否需要将它们迁移到ASP.NET Web应用程序所在的新文件夹.我没有直接访问服务器,我只能通过cpanel访问.

该应用程序需要https,下面我已经包含了我的Startup.cs和Program.cs文件.

我已经概述了我认为在部署和托管中涉及的步骤和注意事项.任何以前有这方面经验的人都能帮我解决问题,或者告诉我任何我错过的事情或其他我应该解决的问题吗?

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

UseIISIntegration()告诉ASP.NET,IIS将作为Kestrel前面的反向代理工作.这还指定了Kestrel应该监听的端口,转发标头和其他详细信息的一些设置.UseKestrel()将Kestrel的IServer接口注册为将用于托管应用程序的服务器.

我要注意我是否需要在这里更改任何内容,或者只是使用deafult选项.

我读过:Microsoft建议将IIS与任何面向公众的站点一起用于ASP.NET核心托管.IIS提供了更多级别的可配置性,管理,安全性,日志记录以及许多其他功能.使用IIS的一大优势是流程管理.IIS将自动启动您的应用程序,如果发生崩溃,可能会重新启动它.如果您将ASP.NET Core应用程序作为Windows服务或控制台应用程序运行,那么您将无法使用该安全网启动并监视该过程.

launchSettings.json

在发布之前,是否需要更改此文件的内容?或者在将应用程序发布到文件夹时会自动更改?例如,我是否需要将ENVIRONMENT更改为"Production",或者将applicationUrl更改为我的网站域?

{
  "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/"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

web.config(适用于ASP.NET Core)

web.config文件应该定义IIS如何启动我的ASP.NET核心进程.例如,我想通过设置stdoutLogEnabled = true来启用输出日志记录,我可能还想更改stdoutLogFile中配置的日志输出位置.

对于适用于反向代理配置的IIS功能,IIS配置受web.config部分的影响.

在我的ASP.NET Core2项目中,当前没有"web.config"文件.我发布应用时会显示此文件吗?

发布到文件夹

从Visual Studio进行部署时,在将文件复制到部署目标之前,会自动执行dotnet发布步骤.

publish文件夹包含应用程序的.exe和.dll文件,其依赖项以及可选的.NET运行时.除.exe和.dll文件外,ASP.NET Core应用程序的发布文件夹通常还包含配置文件,静态资源和MVC视图.

.NET Core应用程序可以作为自包含或依赖于框架的应用程序发布.如果应用程序是自包含的,则包含.NET运行时的.dll文件将包含在publish文件夹中.如果应用程序依赖于框架,则不包括.NET运行时文件,因为该应用程序引用了服务器上安装的.NET版本.

当我在Windows服务器上安装IIS时,我相信我应该使用默认的部署模型,它依赖于框架.

流程经理

ASP.NET Core应用程序是一个控制台应用程序,必须在服务器引导时启动,并在崩溃时重新启动.要自动启动和重新启动,需要进程管理器.我知道我可以在Linux上使用Apache,但在这种情况下我需要使用IIS,因为我当前的站点是Windows服务器.

设置反向代理

需要反向代理的方案是当您有多个应用程序共享在单个服务器上运行的相同IP和端口时.这不能直接与Kestrel一起使用,因为Kestrel不支持在多个进程之间共享相同的IP和端口.将Kestrel配置为侦听端口时,无论主机头是什么,它都会处理该端口的所有流量.然后,可以共享端口的反向代理必须在唯一的IP和端口上转发到Kestrel.

据MS称,使用反向代理服务器还有其他原因.例如,它简化了负载平衡和SSL设置.只有您的反向代理服务器需要SSL证书,并且该服务器可以使用纯HTTP与内部网络上的应用程序服务器通信.

安装.NET Core Windows Server Hosting Bundle

我在部署应用程序之前已经读过,我需要在主机上安装.NET的.NET Core托管包.这将为IIS安装.NET Core运行时,库和ASP.NET Core模块.安装后,您可能需要执行"net stop was/y"和"net start w3svc"以确保为IIS选择所有更改.

我只能通过cpanel访问我的网络服务器,所以我认为我的托管服务提供商需要这样做.

SSL证书

因为我使用https,我相信我需要购买SSL证书并将其安装在IIS中.

IIS安装程序 - 在IIS中创建应用程序

我只能通过cpanel访问我的网络服务器,所以我认为这也需要由我的托管服务提供商完成.

  1. 创建一个新的IIS应用程序池.您将需要在.NET CLR版本的"无托管代码"下创建一个.由于IIS仅用作反向代理,因此它实际上并不执行任何.NET代码.
  2. 在现有IIS站点下创建新应用程序,或创建新的IIS站点.无论哪种方式,您都需要选择新的IIS应用程序池并将其指向您将ASP.NET发布输出文件复制到的文件夹.

Ros*_*lly 3

我研究过 Nginx,但无法获得我需要的支持,而且我的 Linux 经验为零。

我最终将我的托管更改为新的提供商(VPS 上的共享托管),但获得良好的支持仍然是一场噩梦。

事实证明,我不必对launchSettings.json文件进行任何更改。

我的web.config文件最终如下:

    <?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-->
Run Code Online (Sandbox Code Playgroud)

我的.csproj文件如下:

    <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>
Run Code Online (Sandbox Code Playgroud)