2012-08-11 25 views
7

En mi experiencia, tanto como ASP clásico como desarrollador de ASP.NET, siempre he entendido que las llamadas para establecer el valor Server.ScriptTimeout eran de alcance local para la solicitud actual. En otras palabras, llamar al Server.ScriptTimeout = 600 establecería el tiempo de procesamiento para la solicitud actual a 10 minutos. Las solicitudes subsiguientes o incluso concurrentes a otros recursos utilizarán la configuración predeterminada para Server.ScriptTimeout.Configuración Server.ScriptTimeout de alcance global?

Recientemente, en una revisión de código, se me informó que el establecimiento Server.ScriptTimeout a un valor establece el tiempo de procesamiento para cada página en el sitio, hasta que se recicla el grupo de aplicaciones. La sugerido "solución" fue algo como lo siguiente:

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; 
    } 
} 

Esto me parece extraño, como un desarrollador llamando Server.ScriptTimeout = 1 en una página podría provocar la caída del sitio como cualquier otra página sólo se le permitirá procesar durante un segundo . Además, este comportamiento afectaría cualquier solicitud actual que pueda producirse entre los eventos Page_Load y Page_Unload actuales, lo que parece una pesadilla de concurrencia.

que ser a fondo, sin embargo, he hecho un instrumento de prueba que consta de dos páginas - la página una que establece Server.ScriptTimeout a un número muy alto y Página Dos que simplemente muestra el valor actual de Server.ScriptTimeout. No importa qué valor configuro en Página uno, Página dos siempre muestra el valor predeterminado. Entonces, mi prueba parece verificar que Server.ScriptTimeout es de alcance local.

Noté que si my web.config tiene debug = "true", Server.ScriptTimeout no tiene ningún efecto, y MSDN lo menciona explícitamente en su página. En este modo, todas las llamadas para leer el valor de Server.ScriptTimeout devuelven un número absurdamente grande, independientemente de lo que establezca.

Así que mi pregunta es, y de estar absolutamente seguro de que no estoy perdiendo algo, es que hay una instancia que la fijación de un valor para Server.ScriptTimeout afecta el tiempo de procesamiento para la totalidad sitio (de alcance mundial), o es mi creencia válida de que el efecto es local solo en el contexto actual ? He buscado esta pregunta en Google en vano, y MSDN parece no decir nada sobre el tema.

¡Todos los enlaces y/o experiencias, de una forma u otra, serán muy apreciados! La documentación que cubre esto parece escasa, y agradecería cualquier información autorizada.

Respuesta

9

De hecho, es-petición específica:

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); 
    } 
} 

donde _context es HttpContext

+0

Donde es este ejemplo de código de? ¡Gracias por la respuesta! – BradBrening

+2

@BradBrening Reflector es tu amigo :-) – twoflower

+0

Ya veo. Gracias de nuevo, no se obtiene más authorative que un examen real del código de ejecución. – BradBrening

Cuestiones relacionadas