asp.net - 线程如何通过 Http.sys、IIS 和 ASP.NET 与请求绑定(bind)

标签 asp.net multithreading iis http.sys

我目前正在阅读很多关于 node.js 的内容。在使用传统的每个请求线程模型 (Apache) 的服务器和使用事件循环的服务器(Nginx、node、Tornado)之间经常进行比较。

我想详细了解如何在 ASP.NET 中处理请求 - 从在 http.sys 中接收到它一直到在 ASP.NET 本身中处理它。我发现 http.sys 和 IIS 上的 MSDN 文档有点缺乏,但今天我的 google-fu 可能很弱。到目前为止,我找到的最好的资源是 Thomas Marquardt's Blog 上的帖子。 .

任何人都可以对这个话题有更多的了解,或者指出我的任何其他资源吗?

(出于这个问题的目的,我只对具有典型集成管道的 IIS7 感兴趣)

最佳答案

从我目前的研究来看,我的理解是,当请求进入时,它会被放入内核模式请求队列中。根据this ,这避免了当有大量请求(或进程或线程......)时上下文切换的许多问题,为事件 IO 提供了类似的好处。
引自文章:

"Each request queue corresponds to one application pool. An application pool corresponds to one request queue within HTTP.sys and one or more worker processes."



所以据此,每个请求队列可能有多个“Worker Process”。 (谷歌缓存)More on worker processes

据我了解:
  • IIS 打开创建请求队列
    (参见下面的 http.sys api)
  • IIS中配置的一个“网站”对应一个工作进程
  • 一个网站/工作进程shares线程池。
  • 一个线程从请求队列中得到一个请求。

  • 这里有很多关于 IIS7's architecture 的重要信息

    以下是有关 http.sys 的更多信息.
  • HTTP Server I/O Completion Stuff
  • Typical Server Tasks

  • 我仍然有 Unresolved 问题:
  • 如果 IIS 使用 HTTP.SYS,它到底如何更改服务器 header ? ( See this question )


  • 注意:我不确定“内核模式请求队列”是否/如何对应于 IO completion port ,我会假设每个请求都有自己的但我不知道,所以我真的希望有人能更彻底地回答这个问题。我只是偶然发现了this question并且似乎 http.sys 实际上确实使用了 IO 完成端口,它应该提供几乎所有与事件 IO(node.js、nginx、lighttpd、C10K 等)相同的好处。

    关于asp.net - 线程如何通过 Http.sys、IIS 和 ASP.NET 与请求绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4839657/

    相关文章:

    java - 在不同线程和独立类中处理互联网连接

    c# - 如何在多任务环境中防止在azure表中重复插入?

    java - 如何创建一个在我的应用程序运行时一直运行的线程

    .net - 在 IIS 服务器上的 PUT API 调用期间未触发 Application_BeginRequest

    c# - 未应用动态样式

    asp.net - 在 Asp.net Core 和 .NET Framework 网站中使用 ConfigurationManager

    c# - 回发或回调参数无效。使用以下方式启用事件验证

    .net - ASP 4.0 IIS HTTP 404

    c# - 我可以检测我的 HttpModule 中的内容是否已压缩吗?

    asp.net - MaskedEditExtender 上的问题