在.NET 6.0中使用不同的托管模型

本章是《定制ASP NET 6.0框架系列文章》的第六篇。在本章中,我们将讨论如何在ASP NET 6.0中自定义托管宿主。比如,托管选项和不同类型的托管,并了解一下IIS上的托管。限于篇幅,本章只是一个抛砖迎玉。

本章涵盖主题包括:

  • 配置WebHostBuilder

  • 配置Kestrel

  • 配置HTTP.sys

  • IIS上的托管

  • 在Linux上使用Nginx或Apache

本章涉及的服务端体系结构主题包括:
d064d9850f0b8577bf73056a76a280e8.png

1 准备

代码准备

我们先创建一个空运用:
dotnet new web -n ExploreHosting -o ExploreHosting
然后使用VS Code打开该项目:
cd ExploreHosting code .

名词解释:

Hosting 有些地方叫宿主,有些地方叫托管,还有的地方叫承载,为了行文方便,我这里统一叫托管,我们知道他们是同一个意思就行。

2 配置WebHostBuilder

与上一章一样,这个小节我们将重点放在Program.cs上。WebHostBuilder是托管的重要类,它是我们配置和创建Web托管的地方。
以下代码是每个新创建的ASP.NET Core Web项目默认的代码:

var builder = WebApplication.CreateBuilder(args); 
var app = builder.Build(); 
app.MapGet("/", () => "Hello World!"); 
app.Run();

正如我们前面所了解的,默认框架已经帮我们配置了基本的内容,我们可以在在Azure或本地IIS上直接运行。显然以上的配置是最基础的,你完全可以覆写这些默认配置,包括托管的配置。
下面我们一起来看下Kestrel如何配置。

3 配置Kestrel

创建好WebHostBuilder后,我们可以使用各种方法来配置builder。这里,我们只举例一种,即使用Startup类。

在第4章:使用Kestrel配置和自定义HTTPS中我提到,Kestrel是托管应用程序的一种选项,它内置于.NET的Web服务器,基于.NET套接字实现。以前,它是在libuv之上构建的,libuv与Node.js使用相同的web服务器。Microsoft删除了对libuv的依赖,并基于.NET套接字创建了自己的Web服务器Kestrel。

在上一章中,我们使用UseKestrel方法来配置Kestrel选项:
.UseKestrel((host, options) => { // ... })
如上代码所示,第一个参数是WebHostBuilderContext,用于访问已配置的主机设置或配置本身。第二个参数是配置Kestrel的对象。
下面的代码片段显示的是我们在上一章中所做的托管配置需要监听的访问地址:

builder.WebHost.UseKestrel((host, options) => {     var filename = host.Configuration.GetValue("AppSettings:certfilename", "");     var password = host.Configuration.GetValue("AppSettings:certpassword", "");     options.Listen(IPAddress.Loopback, 5000);     options.Listen(IPAddress.Loopback, 5001, listenOptions  => {                   listenOptions.UseHttps(filename, password);         }); 
});

注意:在中添加一个using一个System.Net名称空间。

以上代码演示的是覆盖默认配置,您可以在其中传入URL,例如,使用launchSettings.json文件的applicationUrl属性或环境变量。

接下来,我们看看如何设置HTTP.sys。

4 配置HTTP.sys

这里介绍另一个托管选项HTTP.sys,一个不同的Web服务器的实现。它是一个非常成熟的库,默认嵌入到Windows中,可以用来托管ASP.NET Core应用程序:
.UseHttpSys(options => { // ... })

HTTP.sys不同于Kestrel,它不能在IIS中使用,因为对于IIS来说,它与ASP.NET Core模块无法兼容。
使用HTTP.sys而不是Kestrel的主要原因是:Windows身份验证不能在Kestrel中使用。另外,如果你想将自己的应用暴露到公网当中,当时你又不想使用IIS,也可以使用HTTP.sys。

多年来,IIS一直在HTTP.sys之上运行,这意味着使用UseHttpSys()相当于IIS内部使用相同的Web服务器实现。了解有关HTTP.sys的更多信息,可以访问该地址。

接下来,让我们看看使用IIS托管。

5 IIS上的托管

ASP.NET Core应用程序不应直接暴露于internet,即使它支持Kestrel或HTTP.sys。最好在两者之间有一个反向代理,或者至少有一个监视托管过程的服务。对于ASP.NET Core来说,IIS不仅仅是一个反向代理。它还负责托管进程,以防由于错误而中断。如果发生错误,IIS将重新启动进程。Nginx和IIS类似,主要是用在Linux上的反向代理,也负责托管过程。

假设你已经创建了一个新项目(删除Kestrel相关配置,对IIS不起作用)。
在IIS或Azure上托管ASP.NET Core Web之前,我们需要先编译并发布应用。

dotnet publish -o ..\published -r win-x64

编译后生成的文件可以部署在IIS上,另外它还生成了一个web.config,用于配置IIS或Azure的设置。
如果发布一个自包含的应用程序,它还包含运行时本身,即.NET Core运行时,但是交付时的大小增加了很多。而在IIS上只需创建一个新网站并将其映射到发布输出的文件夹即可。如果你需要考虑更改安全相关内容,或者带一些数据库连接等等,它会变得更加复杂,这不是一篇文章能搞定的。

6 在Linux上使用Nginx或Apache

在Linux上的发布ASP.NET Core应用和IIS上非常相似,因为没有了IIS这个反向代理,所以我们需要为反向代理做准备额外的步骤。一般我们会选择一个网络服务器,如Nginx或Apache作为反向代理,将流量转发给Kestrel和ASP.NET Core应用程序。
首先,我们需要应用接受两个特定的转发头,打开Startup.cs并在UseAuthentication中间件之前的Configure方法中添加以下行:

app.UseForwardedHeaders(new ForwardedHeadersOptions {ForwardedHeaders = ForwardedHeaders.XForwardedFor|ForwardedHeaders.XForwardedProto 
});

另外,还需要添加来自反向代理的传入流量信任,为此需要向ConfigureServices方法添加以下行:

Builder.Services.Configure<ForwardedHeadersOptions>(options => { options.KnownProxies.Add(IPAddress.Parse("10.0.0.108")); 
});

这里别忘了引入Microsoft.AspNetCore.HttpOverrides名称空间。
这里演示的是添加代理的IP地址,然后我们发布应用程序:

dotnet publish --configuration Release

将生成的文件复制到名为/var/www/yourapplication的文件夹中。你可以通过以下命令在Linux上进行快速测试:
dotnet <yourapplication.dll>
这里的yourapplication.dll是已编译的应用程序,包括路径。如果一切正常,我们就能够在http://localhost:5000/访问我们的站点。
如果访问一切正常,应用程序应该作为服务运行,我们需要在/etc/systemd/system/上创建一个服务文件,可以将文件命名为kestrel-yourapplication.service,在其中配置以下内容:

[Unit] Description=Example .NET Web API App running on Ubuntu 
[Service] WorkingDirectory=/var/www/yourapplication ExecStart=/usr/bin/dotnet/var/www/yourapplication/yourapplication.dll 
Restart=always 
# Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 KillSignal=SIGINT SyslogIdentifier=dotnet-example User=www-data Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target

1.确保配置里的路径指向编译生成的文件夹。
2.此文件配置了应用程序应在默认端口上作为服务运行。
3.监视应用程序并在其崩溃时重新启动。
4.定义了来自环境变量的配置(请参阅第1章“自定义日志记录”,了解如何使用环境变量配置应用程序)。

接下来,我们看下如何配置Nginx。

6.1配置Nginx

接下来,我们可以在Nginx上进行配置了:

server {     
listen        80;     
server_name   example.com *.example.com;     location / {         proxy_pass         http://localhost:5000;         proxy_http_version 1.1;         proxy_set_header   Upgrade $http_upgrade;         proxy_set_header   Connection keep-alive;         proxy_set_header   Host $host;         proxy_cache_bypass $http_upgrade;         proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;         proxy_set_header   X-Forwarded-Proto $scheme;     } 
}

以上代码告诉Nginx将端口80上的调用转发给example.com及其子域http://localhost:5000,这是应用程序的默认地址。

6.2配置Apache

Apache配置看起来非常类似于Nginx方法,几乎做了相同的事情:

<VirtualHost *:*>    RequestHeader set "X-Forwarded-Proto       expr=%{REQUEST_SCHEME} 
</VirtualHost> <VirtualHost *:80>     ProxyPreserveHost On  ProxyPass / http://127.0.0.1:5000/   ProxyPassReverse / http://127.0.0.1:5000/     ServerName www.example.com     ServerAlias *.example.com     ErrorLog ${APACHE_LOG_DIR}yourapplication-error.log     CustomLog ${APACHE_LOG_DIR}yourapplication-access.log     common 
</VirtualHost>

以上就是Nginx和Apache的配置内容,更多细节需要你撸起袖子细细体验了。

回顾

ASP.NET Core和.NET CLI已经包含了在各种平台上运行的所有工具,并默认进行了设置,以便为Azure和IIS以及Nginx做好准备。
在.NET 6.0我们用的是WebHostBuilder,它创建了应用程序的托管环境。但是在之前的3.0版本中,我们用的是HostBuilder,它能够创建完全独立于任何Web上下文托管环境。
ASP.NET Core 6.0具有在程序后台运行驻守任务的能力,具体介绍,请期待我们的下一章《使用IHostedService和BackgroundService》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Supplemental Logging

Supplemental Logging分为两种&#xff1a;Database-Level Supplemental Logging和Table-Level Supplemental Logging&#xff0c;即数据库级别和表级别。下面我们来看看Oracle官方文档对其的介绍和说明&#xff0c;引自 http://docs.oracle.com/cd/E11882_01/server.112/e2249…

TypeScript 与 JavaScript 的区别

TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 标准&#xff08;ES6 教程&#xff09;。TypeScript 由微软开发的自由和开源的编程语言。TypeScript 设计目标是开发大型应用&#xff0c;它可以编译成纯 JavaScript&#xff0c;编译出来的 JavaScript 可以…

【caffe】create_cifar10.sh在windows下解决方案

tags caffe python windows下配置caffe后&#xff0c;create_cifar10.sh无法执行&#xff0c;因为是shell脚本。那就看懂脚本意思&#xff0c;用python重写一个&#xff1a; # create_cifar10.py # by ChrisZZimport os import shutilEXAMPLE"examples\\cifar10" DAT…

IO 和NIO的区别

1.IO和NIO的区别 NIO就是New IO在JDK1.4中引入。 IO和NIO有相同的作用和目的&#xff0c;但实现方式不同&#xff0c;NIO主要用到的是块&#xff0c;所以NIO的效率要比IO快不少。 在Java API中提供了两套NIO&#xff0c;一套针对标准输入输出NIO&#xff0c;另一套就是网络编程…

PerfView专题 (第四篇):如何寻找 C# 中程序集泄漏

一&#xff1a;背景 前两篇我们都聊到了非托管内存泄漏&#xff0c;一个是 HeapAlloc &#xff0c;一个是 VirtualAlloc&#xff0c;除了这两种泄漏之外还存在其他渠道的内存泄漏&#xff0c;比如程序集泄漏&#xff0c;这一篇我们就来聊一聊。二&#xff1a;程序集也会泄漏&am…

站立会议第九天

1.站立会议内容 昨天我们成功的将图片插进去了&#xff0c;在这里&#xff0c;图片是使用的png格式&#xff0c;长知识了。我们今天要继续把界面再优化一下。 照片&#xff1a; 2.任务展板 3.燃尽图 转载于:https://www.cnblogs.com/bk1246788/p/6852935.html

Android TimeAnimator

TimeAnimator:提供了一个简单的回调机制&#xff0c;通过 TimeAnimator.TimeListener&#xff0c;在动画的每一帧处通知你。这个动画器没有时间&#xff0c;插值或是对象值设定。回调监听器为每一帧动画接受信息&#xff0c;包括总运行时间和从前一帧到现在的运行时间. 相关方法…

学习nginx 下面只是简单的配置文件

2019独角兽企业重金招聘Python工程师标准>>> #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } …

实现城市治理一网统管,必须这 4 个关键技术

导读&#xff1a;要实现城市治理一网统管&#xff0c;必须具备以下四个关键技术&#xff1a;城市状态一网感知、城市数据一网共享、信息流转三屏联动、虚实映射数字孪生。 作者&#xff1a;郑宇 来源&#xff1a;大数据DT&#xff08;ID&#xff1a;hzdashuju&#xff09; 01…

基于.NetCore开发博客项目 StarBlog - (17) 自动下载文章里的外部图片

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客&#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N…

windbg工具安装配置及dump抓取

安装与配置windbg 安装与配置windbg的symbol(符号) 第一步 下载WinDBG&#xff0c; 第二步 双击下载的文件安装windbg.安装时注意记住安装到那里了. 第三步 windbg访问符号需要两个文件(SYMSRV.DLL 和 SYMSTORE.EXE)所以在环境变量path中将windbg安装目录添加进去&#xff0c;这…

三种Oracle RMAN备份加密策略(下)

说明&#xff1a;本篇参考eygle老师的作品《Oracle DBA手记4&#xff1a;数据安全警示录》&#xff0c;特此表示感谢。 3 、Oracle Wallet加密策略Oracle Wallet是一种加密安全策略&#xff0c;过去我们在TDE&#xff08;Oracle透明加密&#xff09;部分研究过这个组件。简单的…

实现生成订单30分钟未支付,则自动取消

目录 了解需求 方案 1&#xff1a;数据库轮询 思路 实现 优点 缺点 方案 2&#xff1a;JDK 的延迟队列 思路 实现 优点 缺点 方案 3&#xff1a;时间轮算法 思路 实现 优点 缺点 方案 4&#xff1a;redis 缓存 思路一 实现一 解决方案 思路二 实现二 优…

Oracle树形结构查询之prior的理解

--1 建表 create table 宇宙( 行星等级 number ,行星名称 varchar2(50) ,上级行星等级 number); --2 数据准备 insert into 宇宙 (行星等级, 行星名称, 上级行星等级)values (1, 地球, 2); insert into 宇宙 (行星等级, 行星名称, 上级行星等级)values (2, 太阳, 3); insert in…

CA周记-.NET MAUI in GCR 月报(2022年8月)

.NET MAUI 正式版本发布已经三个月了&#xff0c;有小伙伴希望我们有一些关于 .NET MAUI 相关的本地化内容以及开源项目介绍&#xff0c;接下来从8月开始&#xff0c;我希望用月报的形式和大家分享 .NET MAUI 在中国的活动&#xff0c;学习资源&#xff0c;优秀的开源项目&…

Vue的内容分发slot的使用

什么是内容分发&#xff1f;? 概括&#xff1a;将父组件的内容放到子组件指定的位置 场景&#xff1a;在使用组件时&#xff0c;我们常常需要像这样组合使用 < app>< app-header>< /app-header>< app-footer>< /app-footer> < /app> 复制…

一文读懂研发效能洞察的五大流动指标

作者 | 张乐 目录 1 数字化时代&#xff0c;软件研发本身也要数字化 2 流框架及五大流动指标 1. 流动速率 2. 流动时间 3. 流动负载 4. 流动效率 5. 流动分布 3 研发过程中的常见瓶颈及解决思路 1. 稀缺的专家或资源&#xff0c;导致流动受阻 2. 缺乏自动化或工程能…

RabbitMQ队列

RabbitMQ是什么&#xff1f; RabbitMQ是一个在AMQP基础上完整的&#xff0c;可复用的企业消息系统。他遵循Mozilla Public License开源协议。 MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息&…

《ASP.NET Core 6框架揭秘实例》演示[14]:日志的进阶用法

为了对各种日志框架进行整合&#xff0c;微软创建了一个用来提供统一的日志编程模式的日志框架。《ASP.NET Core 6框架揭秘》实例演示[13]&#xff1a;日志的基本编程模式》以实例演示的方式介绍了日志的基本编程模式&#xff0c;现在我们来补充几种“进阶”用法。[本文节选《A…

Linux内核驱动GPIO的使用

一 概述Linux内核中gpio是最简单&#xff0c;最常用的资源(和 interrupt ,dma,timer一样)驱动程序&#xff0c;应用程序都能够通过相应的接口使用gpio&#xff0c;gpio使用0&#xff5e;MAX_INT之间的整数标识&#xff0c;不能使用负数,gpio与硬件体系密切相关的,不过linux有一…