千家信息网

ASP.NET Core怎么配置和管理Web主机

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容主要讲解"ASP.NET Core怎么配置和管理Web主机",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"ASP.NET Core怎么配置和管理We
千家信息网最后更新 2025年01月19日ASP.NET Core怎么配置和管理Web主机

本篇内容主要讲解"ASP.NET Core怎么配置和管理Web主机",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"ASP.NET Core怎么配置和管理Web主机"吧!

    1.前言

    ASP.NET Core应用程序可以配置和启动主机(Host)。主机负责应用程序启动和生命周期管理,配置服务器和请求处理管道。主机还可以设置日志记录、依赖关系注入和配置。而Host主机又包括Web主机(IWebHostBuilder)和通用主机(IHostBuilder)。该章节主要介绍了用于托管Web应用的Web主机。对于其他类型的应用,请使用通用主机。

    2.设置主机

    创建使用IWebHostBuilder实例的主机。通常在应用程序的入口点来执行Main方法。在项目模板中,Main位于Program.cs。典型应用默认调用CreateDefaultBuilder来开始创建主机:

    public class Program{    public static void Main(string[] args)    {        CreateWebHostBuilder(args).Build().Run();    }    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>        WebHost.CreateDefaultBuilder(args)            .UseStartup();}

    2.1执行下列任务

    调用CreateDefaultBuilder的代码位于名为CreateWebHostBuilder的方法中,这让它区分于 Main中对生成器对象调用Run的代码。CreateDefaultBuilder执行下列任务:
    ●使用应用程序的托管配置提供应用程序将Kestrel服务器配置为Web服务器。
    ●将内容根设置为由 Directory.GetCurrentDirectory返回的路径。
    ●通过以下对象加载主机配置:
    ○前缀为ASPNETCORE_的环境变量(例如,ASPNETCORE_ENVIRONMENT)。
    ○命令行参数。
    ●按以下顺序加载应用程序配置:
    ○appsettings.json。
    ○appsettings.{Environment}.json。
    ○应用在使用入口程序集的Development环境中运行时的机密管理器。
    ○环境变量。
    ○命令行参数。
    ●配置控制台和调试输出的日志记录。日志记录包含appsettings.json或appsettings.{Environment}.json文件的日志记录配置部分中指定的日志筛选规则。
    ●使用ASP.NET Core模块在IIS后面运行时,CreateDefaultBuilder会启用IIS集成,这会配置应用程序的基址和端口。IIS集成还配置应用程序以捕获启动错误。
    ●如果应用环境为"开发(Development)",请将ServiceProviderOptions.ValidateScopes设为true。

    2.2重写和增强定义的配置

    ConfigureAppConfiguration、ConfigureLogging以及IWebHostBuilder的其他方法和扩展方法可重写和增强CreateDefaultBuilder定义的配置。下面是一些示例:
    ConfigureAppConfiguration:用于指定应用程序的其他IConfiguration。下面的ConfigureAppConfiguration调用添加委托,以在appsettings.xml文件中添加应用程序配置,该示例在Core系列第11章节有演示。可多次调用ConfigureAppConfiguration。请注意,此配置不适用于主机(例如,服务器URL或环境)。

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>    WebHost.CreateDefaultBuilder(args)    .ConfigureAppConfiguration((hostingContext, config) =>    {        config.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true);});

    ConfigureLogging:ConfigureLogging调用添加委托,将最小日志记录级别 (SetMinimumLevel)配置为LogLevel.Warning。此设置重写CreateDefaultBuilder在appsettings.Development.json和appsettings.Production.json中配置,分别为LogLevel.Debug和LogLevel.Error。可多次调用 ConfigureLogging。

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args)    .ConfigureLogging(logging =>    {        logging.SetMinimumLevel(LogLevel.Warning);});

    ConfigureKestrel:调用ConfigureKestrel来重写CreateDefaultBuilder在配置Kestrel时建立的30,000,000字节默认Limits.MaxRequestBodySize:

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args)    .ConfigureKestrel((context, options) =>    {        options.Limits.MaxRequestBodySize = 20000000;});

    设置主机时,可以提供配置和ConfigureServices方法。如果指定Startup类,必须定义Configure方法。

    3.主机配置值

    WebHostBuilder依赖于以下的方法设置主机配置值:
    ●主机生成器配置,其中包括格式ASPNETCORE_{configurationKey}的环境变量。例如 ASPNETCORE_ENVIRONMENT。
    ●UseContentRoot和UseConfiguration等扩展。
    ●UseSetting和关联键。使用UseSetting设置值时,该值设置为无论何种类型的字符串。

    3.1应用程序键(名称)

    在主机构造期间调用UseStartup或Configure时,会自动设置 IHostingEnvironment.ApplicationName属性。该值设置为包含应用入口点的程序集的名称。要显式设置值,请使用WebHostDefaults.ApplicationKey(环境变量:ASPNETCORE_APPLICATIONNAME):

    public void Configure(IApplicationBuilder app, IHostingEnvironment env){    //应用程序默认名称为:CoreWeb (也就是项目名称)  string an = env.ApplicationName;  ...}public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>    WebHost.CreateDefaultBuilder(args).UseStartup()           .UseSetting(WebHostDefaults.ApplicationKey, "CoreWeb");

    3.2捕获启动错误

    此设置控制启动错误的捕获。当false时,启动期间出错导致主机退出。当true时,主机在启动期间捕获异常并尝试启动服务器(环境变量:ASPNETCORE_CAPTURESTARTUPERRORS)。

    WebHost.CreateDefaultBuilder(args)    .CaptureStartupErrors(true)

    3.3内容根

    此设置确定ASP.NET Core开始搜索内容文件,如MVC视图等。内容根也用作Web根设置的基路径。如果路径不存在,主机将无法启动(环境变量:ASPNETCORE_CONTENTROOT)。

    WebHost.CreateDefaultBuilder(args)    .UseContentRoot("c:\\")

    3.4详细错误

    确定是否应捕获详细错误。启用(或当环境设置为Development)时,应用捕获详细的异常(环境变量:ASPNETCORE_DETAILEDERRORS)。

    WebHost.CreateDefaultBuilder(args)    .UseSetting(WebHostDefaults.DetailedErrorsKey, "true")

    3.5环境

    设置应用程序的环境。环境可以设置为任何值。框架定义的值包括Development、Staging和Production。值不区分大小写。默认情况下,从ASPNETCORE_ENVIRONMENT环境变量读取环境。使用Visual Studio时,可能会在launchSettings.json文件中设置环境变量。有关于环境详情信息,可以移步到Core系列第10章节有参阅(环境变量:ASPNETCORE_ENVIRONMENT)。

    WebHost.CreateDefaultBuilder(args)    .UseEnvironment(EnvironmentName.Development)

    3.6HTTPS端口

    设置HTTPS重定向端口。用于强制实施HTTPS(环境变量:ASPNETCORE_HTTPS_PORT)。

    WebHost.CreateDefaultBuilder(args)    .UseSetting("https_port", "8080")

    3.7服务器(Kestrel) URL

    指示IP地址或主机地址,其中包含服务器应针对请求侦听的端口和协议。设置为服务器应响应的以分号分隔 (;) 的URL前缀列表。例如 http://localhost:123。使用"*"指示服务器应针对请求侦听的使用特定端口和协议(例如 http://*:5000)的IP地址或主机名。协议(http://或https://)必须包含每个URL。不同的服务器支持的格式有所不同(环境变量:ASPNETCORE_URLS)。

    WebHost.CreateDefaultBuilder(args)    .UseUrls("https://*:5000;https://localhost:5001;https://hostname:5002")

    4.重写配置

    使用配置可以配置Web主机。在下面的示例中,主机配置是根据需要在hostsettings.json文件中指定。命令行参数可能会重写从hostsettings.json文件加载的任何配置。生成的配置(在config中)用于通过UseConfiguration配置主机。
    新建一个hostsettings.json文件,内容如下:

    {  "urls": "https://*:5005"}
    public static IWebHostBuilder CreateWebHostBuilder(string[] args){    //IConfigurationBuilder的配置主机    var config = new ConfigurationBuilder()        .SetBasePath(Directory.GetCurrentDirectory())        //主机配置在hostsettings.json文件中指定        .AddJsonFile("hostsettings.json", optional: true)        //输入的命令行参数可能会重写从hostsettings.json文件加载的任何配置        .AddCommandLine(args)        .Build();    return WebHost.CreateDefaultBuilder(args)        .UseUrls("https://*:5001")        .UseConfiguration(config)        .Configure(app =>        {            //生成的配置委托函数            app.Run(context =>                context.Response.WriteAsync("Hello, World!"));        });}

    上述代码描述意思是若要指定在特定的URL上运行的主机,所需的值可以在执行dotnet运行时从命令提示符传入。命令行参数重写hostsettings.json文件中的urls值,且服务器侦听端口8080:

    dotnet run --urls "http://*:8080"

    主机启动时,先用hostsettings.json config重写UseUrls提供的urls参数配置,然后再用命令行参数config重写hostsettings.json config的urls参数配置。

    5.管理主机

    管理主机启动方式有Run和Start两种。Run方法启动Web应用程序并阻止调用线程,直到关闭主机。Start方法通过调用自身以非阻止方式运行主机。

    //RunCreateWebHostBuilder(args).Build().Run();
    //Start:非阻止方式,所有必须加上ReadLineCreateWebHostBuilder(args).Build().Start();Console.ReadLine();

    6.IHostingEnvironment接口

    IHostingEnvironment接口提供有关应用的Web承载环境的信息。使用构造函数注入获取 IHostingEnvironment以使用其属性和扩展方法:

    //示例1:public class CustomFileReader{    private readonly IHostingEnvironment _env;    public CustomFileReader(IHostingEnvironment env)    {        _env = env;    }    public string ReadFile(string filePath)    {        var fileProvider = _env.WebRootFileProvider;        // Process the file here    }}

    可以用于在启动时基于环境配置应用程序或者将IHostingEnvironment注入到Startup构造函数,用于ConfigureServices:

    //示例2:public class Startup{    public Startup(IHostingEnvironment env)    {        HostingEnvironment = env;    }    public IHostingEnvironment HostingEnvironment { get; }    public void ConfigureServices(IServiceCollection services)    {        if (HostingEnvironment.IsDevelopment())        {            // Development configuration        }        else        {            // Staging/Production configuration        }        var contentRootPath = HostingEnvironment.ContentRootPath;    }}

    IHostingEnvironment服务还可以直接注入到Configure方法以设置处理管道:

    //示例3:public void Configure(IApplicationBuilder app, IHostingEnvironment env){    if (env.IsDevelopment())    {        // In Development, use the Developer Exception Page        app.UseDeveloperExceptionPage();    }    else    {        // In Staging/Production, route exceptions to /error        app.UseExceptionHandler("/error");    }    var contentRootPath = env.ContentRootPath;}

    创建自定义中间件(要了解中间件的同学们,可以移步到第四章节学习)时可以将IHostingEnvironment 注入Invoke方法:

    public async Task Invoke(HttpContext context, IHostingEnvironment env){    if (env.IsDevelopment())    {        // Configure middleware for Development    }    else    {        // Configure middleware for Staging/Production    }    var contentRootPath = env.ContentRootPath;}

    7.IApplicationLifetime接口

    IApplicationLifetime允许后启动和关闭活动。接口上的三个属性是用于注册Action方法(用于定义启动和关闭事件)的取消标记。

    取消标记

    触发条件

    ApplicationStarted

    主机已完全启动。

    ApplicationStopped

    主机正在完成正常关闭。应处理所有请求。 关闭受到阻止,直到完成此事件。

    ApplicationStopping

    主机正在执行正常关闭。仍在处理请求。关闭受到阻止,直到完成此事件。

    public class Startup{    public void Configure(IApplicationBuilder app, IApplicationLifetime appLifetime)    {        appLifetime.ApplicationStarted.Register(OnStarted);        appLifetime.ApplicationStopping.Register(OnStopping);        appLifetime.ApplicationStopped.Register(OnStopped);        Console.CancelKeyPress += (sender, eventArgs) =>        {            appLifetime.StopApplication();            // Don't terminate the process immediately, wait for the Main thread to exit gracefully.            eventArgs.Cancel = true;        };    }    private void OnStarted()    {        // Perform post-startup activities here    }    private void OnStopping()    {        // Perform on-stopping activities here    }    private void OnStopped()    {        // Perform post-stopped activities here    }}

    StopApplication是请求应用终止的意思。以下类在调用类的Shutdown方法时使用StopApplication正常关闭应用:

    public class MyClass{    private readonly IApplicationLifetime _appLifetime;    public MyClass(IApplicationLifetime appLifetime)    {        _appLifetime = appLifetime;    }    public void Shutdown()    {        _appLifetime.StopApplication();    }}

    8.作用域验证

    如果应用环境为"开发(Development)",则CreateDefaultBuilder将ServiceProviderOptions.ValidateScopes设为true。若将ValidateScopes设为true,默认服务提供应用程序会执行检查来验证以下内容:
    ●作用域服务不能直接或间接地从根服务提供者解析。
    ●作用域服务不会直接或间接地注入到单例中(服务的生命周期)。
    若要始终验证作用域(包括在生命周期环境中验证),请使用主机生成器上的 UseDefaultServiceProvider配置ServiceProviderOptions:

    WebHost.CreateDefaultBuilder(args)    .UseDefaultServiceProvider((context, options) => {        options.ValidateScopes = true;})

    到此,相信大家对"ASP.NET Core怎么配置和管理Web主机"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    主机 配置 应用 环境 程序 服务 应用程序 方法 变量 服务器 文件 内容 参数 管理 命令 日志 示例 端口 错误 作用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络上存在的几种网络安全威胁 软件开发多久能赚到100万 上海智能软件开发技术指导 数据库提示未明确定义列 drop在数据库的意思 依托于网络技术的创业机会 网络安全审计问题整改情况报告 平安银行总部软件开发 2019年重庆网络安全周 国家网络安全宣传周上海地铁 四川专业软件开发哪家便宜 怎么王者现在显示服务器未响应 哪里有教软件开发的学校 软件开发工作如何量化 我国网络安全面临的挑战包括 电子临床数据库研究报告 管理企业qq软件开发 电子竞技软件开发一个月工资 传奇3修改数据库后没效果 外文数据库的文献信息特点 广东工业软件开发价钱是多少 应用软件开发转嵌入式 wps文件同步到网络安全吗 数据库设计的基本操作包括 打印机的rpc服务器是什么 网络安全设备的所知所想 企业文件存放服务器安全吗 sd数据库在哪 管理企业qq软件开发 南宁咪咕网络技术有限公司
    0