http 服务器的责任与使用此服务器托管的 Web 应用程序的责任

Responsibility of the http server vs responsibility of the web app hosted using this server

我正在评估 ASP.NET 核心应用程序的各种托管选项。 在 ASP.NET 的新编程模型中,您使用一组中间件(它们是旧 IHttpModuleIHttpHandler 的混合物)处理请求。

您可以拥有一个中间件,它可以负责身份验证、处理静态文件或在发送前压缩响应(仅举几例)。 困惑来了。

在责任上下文中服务器和应用程序之间的边界在哪里设置?

哪一方应该负责压缩响应?对于 IIS,这由服务器处理并在 web.config 中配置。 Kestrel 不提供此功能 AFAIK,因此您需要在应用程序中实现自定义中间件来为您处理此问题。哪个更合适?

身份验证呢? IIS 提供身份验证设置(匿名、模拟、表单身份验证)。相反,在 ASP.NET Core 中我们也可以编写一个应用程序中间件来为我们处理这个问题。

好的,SSL 由服务器处理,因为它位于协议层下方,应用程序仅在 HTTP(S) 上运行。

服务器应该有什么职责?应用应该承担什么责任?

服务器负责实现基本 HTTP 协议、管理连接等。它也可能选择提供其他功能(例如 windows auth),但我们建议不要使用它,除非它可以提供与中间件实现相比具有明显的优势。例如。 Windows auth 可以在中间件中实现,但由于某些连接管理限制,它会更加困难。压缩可以在中间件中实现,就像在服务器中一样容易。

wikipedia 所述:

"The primary function of a web server is to store, process and deliver web pages to clients"

事实是,所有著名的 http 服务器(nginx、apache、IIS 等)都带有许多模块,可以处理许多不同的任务,包括您在问题中提到的任务(身份验证、压缩、 ...).

很可能您添加的模块越多,您的 http 服务器就越慢。例如,IIS 目前还不是最快的 http 服务器,但是如果你删除所有模块并将它仅用于提供资源,那么它会变得非常快,因为它在天!

责任问题对于任何软件应用都是一样的。
想想主要作用是存储数据的数据库。像 Oracle 或 SQL Server 这样的 RDBMS 非常擅长。但是一旦他们发布新版本,他们也会发布与存储数据无关的新功能。人们使用它! ;-)
人们有多少次将他们的数据库用作搜索引擎?我看到有人用 SQL 服务器发送邮件!但更糟糕的是有些人试图在存储过程中调用网络服务 ;-)

拥有一个工具来做所有事情总是很诱人,但您需要记住,它并不是为所有目的而构建的。我宁愿使用一堆具有单一职责并且能够正确处理它的轻量级工具。

回到你的问题,我认为使用中间件是一个很好的方法。这样你就可以控制整个管道,并且你确切地知道你的请求已经通过了什么。中间件也是可测试的!摆脱所有不必要的模块肯定会让您获得更轻量级的 http 服务器。

正经的"it depends"回答也可以。如果你做了一些测试并意识到 gzip 压缩模块比中间件快 10 倍,那就选择这个模块吧!也不要教条!