我正在评估ASP.NET Core应用程序的各种托管选项。
在ASP.NET的新编程模型中,您使用一组中间件(混合了较早的IHttpModule
和IHttpHandler
)来处理请求。
您可以拥有一个中间件,可以负责身份验证,处理静态文件或在发送之前压缩响应(只是为了命名一些)。 这就是混乱。
在责任范围内在服务器和应用之间设置边框的位置?
哪一方应负责压缩响应?使用IIS,它由服务器处理并在web.config中配置。 Kestrel不提供此功能AFAIK,因此您需要在应用程序中实现自定义中间件,以便为您处理此问题。哪一个更合适?
身份验证怎么样? IIS提供身份验证设置(匿名,模拟,表单身份验证)。相反,在ASP.NET Core中,我们还可以编写一个可以为我们处理此问题的应用程序中间件。
好的, SSL 由服务器处理,因为它位于协议层的下方,而app仅在HTTP(S)上运行。
服务器应该承担什么责任?应用程序应该承担什么责任?
答案 0 :(得分:1)
服务器负责实现基本HTTP协议,管理连接等。它也可以选择提供其他功能(例如windows auth),但我们建议不要使用它,除非它可以提供比中间件实现明显的优势。例如。 Windows身份验证可以在中间件中实现,但由于某些连接管理限制,它会更加困难。压缩可以在中间件中实现,就像在服务器中一样容易。
答案 1 :(得分:1)
正如wikipedia所述:
“Web服务器的主要功能是存储,处理和交付 网页给客户“
问题是所有着名的http服务器(nginx,apache,IIS,...)都带有许多模块,可以处理许多不同的任务,包括你在问题中提到的那些(身份验证,压缩,... )。
你添加的模块越多,你的http服务器就越慢。到目前为止,IIS并不知道是最快的http服务器,但是如果你删除所有模块并仅仅用于服务资源,那么它将变得非常快,因为它已经构建为在天!
责任问题与所有类型的软件应用程序相同
想想主要用于存储数据的数据库。像Oracle或SQL Server这样的RDBMS非常擅长。但是一旦他们发布了新版本,他们也会发布一个与存储数据无关的新功能。人们用它! ;-)
人们使用数据库作为搜索引擎的次数是多少?我看到人们用SQL Server发送邮件!但更糟糕的是有些人试图在商店程序中调用webservices; - )
总是很想拥有一个工具来做所有事情,但你需要记住它并不是为各种目的而构建的。我宁愿使用一堆轻量级工具,只有一个单一的责任,而是正确处理它。
现在回到你的问题,我认为这是一种利用中间件的好方法。这样您就可以控制整个管道,并确切地知道您的请求已经完成了什么。中间件也是可测试的!摆脱所有不必要的模块肯定会带你到一个更轻量级的http服务器。
正义的“依赖”答案也是可以接受的。如果你做了一些测试并意识到gzip压缩模块比中间件快10倍,那就去模块吧!不要教条主义!