为什么单个Web请求会创建对我的defaultdocument页面的第二个单独的线程调用?

时间:2012-09-04 19:28:00

标签: c# asp.net multithreading iis-7 default-document

在VS2010本地调试我的Web应用程序时,我看到一些非常奇怪的行为。生产中会发生相同的用户旅程/页面序列。

调试,我看到了:

1. request for MyPage.aspx - handled by thread_1
2. (there is something on that page that IIS/ASP.Net doesn't like it seems) I'm slowly removing sections to pin-point exactly but there's
no JS, or anything fancy there just html content, user controls etc.
3. Either way a separate thread_2 to begin processing the Page_Load of my defaultdocument i.e. home.aspx is executed. There is logic in
home.aspx.cs to clear some data.
4. So when thread_1 continues processing, checks against the data above fail, resulting with the user being redirected to an error page.

任何人都可以了解为什么第二个线程被创建以及为什么它开始处理我的默认文档?

请注意:

  • 我检查了全局错误方法,例如: Session_End中, app_error等但没什么。
  • 我间歇性地看到启用了失败请求跟踪日志记录的401错误但我不明白这将如何启动 处理我的默认主页?
  • 只是为了进行健全性检查,我在web.config的defaultdocument列表的开头放置了一个新的doc test.aspx,它确实被调用了。

似乎IIS / ASP.Net中的某些内容被配置为开始处理错误的默认页面,但这对我来说是新行为吗?

我已经尝试过对此进行研究,但似乎唯一可能与之相关的是线程敏捷性,但我不太确定......?

2 个答案:

答案 0 :(得分:1)

似乎有两个HTTP请求同时运行。由于每个请求(通常)都在其线程上执行,因此这种情况是有意义的。

默认情况下,HTTP请求不共享状态。它们根据不同的数据运行。因此,这不是线程安全问题。

此规则的例外情况是,如果您明确共享状态,例如使用静态变量。你不应该出于各种原因这样做。

调试问题启动Fiddler并检查正在执行的HTTP请求。同样在两个并发线程的每一个上都有示例HttpContext.Current.Request.RawUrl

答案 1 :(得分:0)

在错误的MyPage.aspx中删除了大量内容后,我遇到了有罪的代码:btnShowPost.ImageUrl = SitePath + "post.png";(它从未在if语句后面访问过),因此图像<asp:Image ID="btnShowPost" runat="server" />从未设置必要的ImageUrl。

没有它,显然这是标准的浏览器行为:任何img,脚本,css等,带有 src = missing,将使用默认路径作为url。 iis通常会重定向到default.aspx(或默认值)。

See full explanation on this link