【发布时间】:2012-01-27 06:08:26
【问题描述】:
我的网站在 IIS7 上运行,所有脚本都使用 ASP Classic 编码。我最近注意到在我的网站上上传文件时,我无法打开任何其他页面。
这是场景: 我开始使用网络表单上传视频文件,在上传文件时,我尝试在同一网站上打开另一个页面,但除非上传完全完成,否则它不会接收和加载单个字节!
有什么想法吗?
【问题讨论】:
标签: iis file-upload asp-classic iis-6
我的网站在 IIS7 上运行,所有脚本都使用 ASP Classic 编码。我最近注意到在我的网站上上传文件时,我无法打开任何其他页面。
这是场景: 我开始使用网络表单上传视频文件,在上传文件时,我尝试在同一网站上打开另一个页面,但除非上传完全完成,否则它不会接收和加载单个字节!
有什么想法吗?
【问题讨论】:
标签: iis file-upload asp-classic iis-6
Session 对象是造成这种情况的原因。 Session 对象属于一个 STA(单线程单元)。当属于特定会话的请求到达时,处理该请求的工作线程将进入会话对象所属的单元。然而,它只能这样做如果该单元中已经没有另一个线程(因为 STA 一次只能容纳一个线程)。
因此,您的浏览器开始上传文件,正在执行与该浏览器会话相关联的 ASP 请求。处理该上传请求的工作线程进入会话对象所属的单元。现在您正在尝试加载另一个页面,而另一个请求仍在进行中。当第二个请求到达时,ASP 会发现它无法让另一个工作线程进入相同的会话单元,因为它已经被第一个请求占用了。因此,ASP 会将第二个请求放入队列中,等待第一个请求腾出公寓。
避免这种情况的唯一方法是关闭 ASP 会话。这将允许 ASP 同时处理来自同一浏览器的请求。然而,严重的缺点是您将不再需要使用 Session 对象。您必须自己实现任何服务器端会话管理,包括处理并发问题,例如尝试同时访问任何会话数据的两个请求。
【讨论】:
只有您的网站无法打开还是其他网站也无法打开?
如果是后者,请为您的互联网购买更好的套餐。
【讨论】: