我正在尝试确定 ASP.NET 工作线程的角色。我的 IIS 7 安装默认允许最多 25 个工作线程,否则我会将其设置为 1。
当用户请求.aspx
页面时,我知道该请求将检索工作线程。但是该页面上每个图像的加载是否也占用了一个工作线程?一旦检索到图像,检索它的工作线程是否也负责将其传输给用户(通过阻塞 TCP 套接字?)?
让我们看一下对 ASPX 页面的 Web 请求在用户及其浏览器中的外观。
用户将浏览器导航到 ASPX 页面。在服务器上,IIS 将此识别为 ASP.NET 请求并将其路由到 .NET 处理程序进行处理,其中包括获取工作线程、处理页面并将生成的 HTML 传递回用户的浏览器。这不包括交付实际的图像、JavaScript 文件、CSS 文件和其他外部资源 - 只是从页面本身生成的 HTML 返回到用户的浏览器。
当用户的浏览器呈现页面时,它会对页面上的其他资源(图像、JavaScript 文件等)发出额外的请求。当 IIS 接收到对这些文件的请求时,它会将它们作为静态内容处理,因此 ASP .NET 处理程序(及其工作进程)不参与处理或交付内容。
请注意,您可以将 IIS 配置为使用 .NET 处理程序来处理这些类型的请求,但对于静态内容,IIS 不会开箱即用地执行此操作。
IIS 7 的安装程序在安装时包括“Common Http Features->Static Content”。这个模块负责处理静态内容,我不相信它使用任何工作线程。
一个工作线程似乎有点微不足道,即使对于测试服务器也是如此。如果您的代码进入一个长进程(比如一个长查询),您将被阻止运行其他页面等待单个工作进程。是什么促使您希望将其设置为 1?
我不确定您说的是哪个 IIS 版本,所以这是我在 v5.1 上读到的一些内容。
使用 ASPCompat 和会话状态时,运行时可能会将对同一会话的请求序列化到单个线程。
否则,默认情况下,如果您向应用程序向睡眠页面发出 12 个请求,ASP.NET 将使每个后续请求等待,直到一个线程被前一个请求释放。您可以通过和配置设置 (machine.config) 控制此行为,其中并发线程数是 maxWorkerThreads 和 minFreeThreads 之间的差异。还请仔细检查这些设置是否设置为使您的应用程序只能同时处理一个 ASP.NET 请求。
是的,如果您的 asp.net 应用程序代码中有阻塞呼叫。
如果您使用所有在内存中的数据响应请求,则否。
静态图像不应该通过 Asp.Net 提供,像 IIS 或 nginx 这样的静态文件服务器应该会更快。