Domanda

Voglio limiti di connessione diversi per alcuni URL nella mia applicazione. Alcuni URL accettano caricamenti di file e devono avere un timeout di connessione di grandi dimensioni. Tutti gli altri URL necessitano di un timeout molto più piccolo per prevenire la negazione del servizio e non le risorse di spreco.

Attualmente ho la proprietà Timeout di connessione in IIS impostata per l'intero sito a 60 minuti. Poi l'ho fatto su web.config:

<system.web>
    <httpRuntime executionTimeout="480" maxRequestLength="1024" />
</system.web>

<location path="FileUpload/WriteFile.rails">
    <system.web>
        <httpRuntime executionTimeout="3600" maxRequestLength="512000" />
    </system.web>
</location>

Quindi speravo che questo avesse messo tutti gli URL su un timeout di 8 minuti e consentiva all'URL WriteFile.rails di funzionare per 60 minuti. Invece tutti gli URL possono funzionare per 60 minuti. Come faccio a convincere IIS a fare quello che voglio?

È stato utile?

Soluzione

La domanda ha posto specificamente sui timeout, ma anche l'impostazione implicita di MaxRequestLength. Cercherò di dare una risposta davvero completa ad entrambi i problemi (ora che ho trascorso la maggior parte della giornata a risolverlo).

Diciamo che abbiamo un singolo URL sul nostro sito Web che vogliamo elaborare i caricamenti di file. Vogliamo assumere un gigabyte di dati su quell'URL e consentiremo ai clienti di essere connessi al massimo, 1 ora. Tutti gli altri URL che vogliamo consentire solo 90 secondi di tempo di connessione e un massimo di 4 MB nel corpo post.

Impostazioni globali

Per prima cosa devi aumentare a livello globale i limiti in tempo e dimensioni per l'intero sito. Per prima cosa si desidera impostare il "timeout di connessione" per l'intero sito. Questo agisce come un limite superiore assoluto e non può essere impostato da Web.config. Il sito web IIS7 ha Buone istruzioni qui. Puoi anche farlo programmaticamente con il Microsoft.Web.Administration biblioteca che è stato spedito con IIS7/7.5:

var serverManager = ServerManager.OpenRemote("\\web-server-name");
var site = serverManager.Sites["Your-Site-Name"];
site.Limits.ConnectionTimeout = new TimeSpan(1, 0, 0);

Successivamente è necessario impostare la richiesta di dimensioni massime che il sito consentirà. Questo è in un posto totalmente diverso, nel modulo di fitlering di richiesta. Questo modulo potrebbe non essere installato per impostazione predefinita su IIS7. Ancora una volta Microsoft ha buone istruzioni per come impostare il maxAllowedContentLength attraverso la GUI. Questo è qualcosa che puoi impostare da Web.config:

<system.webServer>
    <security>
        <requestFiltering>
            <!-- Allow 1GB uploads -->
            <requestLimits maxAllowedContentLength="1073741824"></requestLimits>
        </requestFiltering>
    </security>
</system.webServer>

Questa impostazione viene valutata rispetto al Content-Length Intestazione e richieste più grandi di ciò comporteranno immediatamente un 404,13. L'impostazione è in byte e ciò che viene dopo è in kilobyte, molto coerente questo IIS7.

Impostazioni ASP.NET

Successivamente vogliamo limitare tutte le richieste ASP.NET a 90 secondi/4 MB. Questo può essere fatto su Web.config:

<location>
    <system.web>
        <httpRuntime executionTimeout="90" maxRequestLength="4096" />
    </system.web>
</location>

Per rendere le impostazioni globali system.web tag è avvolto in un file location tag che non ha no path attributo. (Nella domanda originale non ho avvolto il sistema. Tag Web nel tag di posizione che era probabilmente la fonte del mio problema.) maxRequestLength Questa volta è a Kilobytes.

Infine, vogliamo consentire al nostro URL di upload speciale di accettare carichi enormi. L'impostazione di questi valori più alti di quelli che impostato a livello globale non funzionano. I valori globali sostituiscono queste impostazioni.

<location path="Uploads/PostFile.rails">
    <system.web>
        <httpRuntime executionTimeout="3600" maxRequestLength="1048576" />
    </system.web>
</location>

Se tutto il resto è impostato bene, questo dovrebbe farlo. Come ha suggerito Peter Bromberg, è possibile aggiungere quanti di questi blocchi necessari per aumentare i limiti per URL specifici.

Un'ultima nota: nella modalità di debug IIS non applica il timeout di connessione o le impostazioni di ExecutionTimeout, per consentire più tempo per il debug. Quindi, per testare l'impostazione su una macchina per sviluppatori, è necessario eseguire una build di rilascio e è necessario impostare l'impostazione "abilita il debug lato server" su false.

Altri suggerimenti

Puoi sempre impostare ScriptTimeout direttamente nell'azione del controller. In questo modo la configurazione non si interrompe se si modifica il routing.

Per impostare il timeout per una pagina specifica, puoi usare altrettanti

<location path="Myfile.aspx">
  <system.web>
    <httpRuntime executionTimeout="180"/>
  </system.web>
</location>

Finché il percorso è definito correttamente e l'estensione .rails è mappata su ASP.NET, questo dovrebbe funzionare. Potrebbe essere che il motore di esecuzione ASP.NET non stia elaborando *. Estensioni dei raggi?

NOTA: amico What A Pessy Post Editor. Perché non puoi fare la fuga per l'utente?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top