2012-08-11 8 views
7

In tutta la mia esperienza, sia come ASP classico che ASP.NET, ho sempre capito che le chiamate per impostare il valore Server.ScriptTimeout erano locali nell'ambito della richiesta corrente. In altre parole, chiamando Server.ScriptTimeout = 600 si imposta il tempo di elaborazione per la richiesta corrente su 10 minuti. Richieste successive o anche concorrenti ad altre risorse utilizzeranno l'impostazione predefinita per Server.ScriptTimeout.Impostazione Server.ScriptTimeout globale nell'ambito?

Recentemente in una revisione del codice, sono stato informato che l'impostazione Server.ScriptTimeout ad un valore imposta il tempo di elaborazione per ogni pagina del sito, fino a quando il pool di applicazioni viene riciclato. La "correzione" suggerito era qualcosa di simile al seguente:

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

Questo sembra strano per me, come sviluppatore chiamando Server.ScriptTimeout = 1 in una pagina potrebbe far cadere il sito come ogni altra pagina sarà consentito solo per elaborare per un secondo . Inoltre, questo comportamento influirebbe su eventuali richieste correnti che potrebbero verificarsi tra gli eventi Page_Load e Page_Unload correnti, il che sembra un incubo di concorrenza.

di essere approfondita, però, ho fatto un test harness costituito da due pagine - Page One che imposta Server.ScriptTimeout a qualche numero veramente alto e Pagina Due che visualizza semplicemente il valore corrente per Server.ScriptTimeout. Indipendentemente dal valore impostato su Page One, Pagina Due mostra sempre il valore predefinito. Quindi, il mio test sembra verificare che lo Server.ScriptTimeout sia localizzato nell'ambito.

Ho notato che se il mio web.config ha il debug = "true", Server.ScriptTimeout non ha alcun effetto - e MSDN lo afferma esplicitamente sulla sua pagina. In questa modalità, tutte le chiamate per leggere il valore per Server.ScriptTimeout restituiscono un numero assurdamente grande, indipendentemente da come l'ho impostato.

Quindi la mia domanda è, e per essere assolutamente sicuro che non mi manca qualcosa, c'è un caso che l'impostazione di un valore per Server.ScriptTimeout influisce sul tempo di elaborazione per il intero sito (di portata globale), oppure è il mio credenza valida che l'effetto sia locale solo per il contesto attuale ? Ho cercato su Google questa domanda senza alcun risultato, e MSDN sembra essere silenzioso sul problema.

Qualsiasi link e/o esperienza - in un modo o nell'altro - sarà molto apprezzato! La documentazione che lo riguarda sembra scarsa e apprezzerei qualsiasi informazione autorevole.

risposta

9

E in effetti è specifica richiesta:

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

dove _context è HttpContext

+0

dove si trova questo esempio di codice da? Grazie per la risposta! – BradBrening

+2

@BradBrening Reflector è tuo amico :-) – twoflower

+0

Capisco. Grazie ancora, non diventa più autorevole di un vero esame del codice in esecuzione. – BradBrening