根据我的经验,无论是作为经典ASP还是ASP.NET开发者,我总是理解设置Server.ScriptTimeout
值的调用是当前请求的本地范围。换句话说,调用Server.ScriptTimeout = 600
会将当前请求的处理时间设置为10分钟。对其他资源的后续甚至并发请求将使用Server.ScriptTimeout
的默认设置。
最近在代码审核中,我被告知将Server.ScriptTimeout
设置为值会设置网站中每个页面的处理时间,直到应用程序池被回收。建议的“修复”类似于以下内容:
public class MyPage : Page {
private const int desiredTimeout = 600;
private int cachedTimeout;
private void Page_Load(object sender, EventArgs e) {
// cache the current timeout in a private store.
cachedTimeout = Server.ScriptTimeout;
Server.ScriptTimeout = desiredTimeout;
}
private void Page_Unload(object sender, EventArgs e) {
// restore the previous setting for the timeout
Server.ScriptTimeout = cachedTimeout;
}
}
这对我来说似乎很奇怪,因为在页面中调用Server.ScriptTimeout = 1
的开发人员可能会关闭该网站,因为每个其他页面只允许处理一秒钟。此外,此行为将影响当前Page_Load和Page_Unload事件之间可能发生的任何当前请求 - 这似乎是并发噩梦。
然而,为了彻底,我制作了一个由两页组成的测试工具 - Page One ,将Server.ScriptTimeout
设置为一些非常高的数字和第二页只显示Server.ScriptTimeout
的当前值。无论我在 Page One 上设置什么价值,第二页始终显示默认值。因此,我的测试似乎验证Server.ScriptTimeout
是否属于本地范围。
我注意到如果我的web.config有debug =“true”,Server.ScriptTimeout
没有效果 - 并且MSDN在其页面上明确说明了这一点。在这种模式下,无论我将其设置为什么,所有读取Server.ScriptTimeout
值的调用都会返回一个荒谬的大数字。
所以我的问题是,并且绝对确定我没有遗漏某些内容,是否有设置Server.ScriptTimeout
值的实例会影响整个网站的处理时间(全局范围),或者我认为效果只对当前上下文本地有效?我用谷歌搜索这个问题无济于事,MSDN似乎对这个问题保持沉默。
任何链接和/或体验 - 无论如何 - 将不胜感激!涉及此文件的文件似乎很少,我希望获得任何权威信息。
答案 0 :(得分:10)
确实是特定于请求:
public int ScriptTimeout
{
get
{
if (this._context != null)
{
return Convert.ToInt32(this._context.Timeout.TotalSeconds, CultureInfo.InvariantCulture);
}
return 110;
}
[AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Medium)]
set
{
if (this._context == null)
{
throw new HttpException(SR.GetString("Server_not_available"));
}
if (value <= 0)
{
throw new ArgumentOutOfRangeException("value");
}
this._context.Timeout = new TimeSpan(0, 0, value);
}
}
其中_context
为HttpContext