web-dev-qa-db-fra.com

Comment définir différents délais d'expiration pour différentes URL dans ASP.NET

Je souhaite des limites de connexion différentes pour certaines URL de mon application. Certaines URL acceptent les téléchargements de fichiers et nécessitent un délai de connexion important. Toutes les autres URL nécessitent un délai d'expiration beaucoup plus court pour éviter les dénis de service et ne pas gaspiller les ressources.

Actuellement, la propriété Délai de connexion dans IIS est définie pour l'ensemble du site sur 60 minutes. Ensuite, j'ai fait ceci dans le 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>

J'espérais donc que toutes les URL seraient réglées à 8 minutes et que l'URL WriteFile.Rails serait exploitable pendant 60 minutes. Au lieu de cela, TOUTES les URL sont autorisées à s'exécuter pendant 60 minutes. Comment faire pour que IIS fasse ce que je veux?

16
Gareth Farrington

La question portait spécifiquement sur les délais d'attente, mais impliquait également la définition de maxRequestLength. Je vais essayer de donner une réponse très complète à ces deux problèmes (maintenant que j'ai passé presque toute la journée à le résoudre).

Disons que nous avons une seule URL sur notre site Web pour traiter les téléchargements de fichiers. Nous voulons collecter jusqu'à un gigaoctet de données sur cette URL et permettre aux clients d'être connectés pendant au plus une heure. Toutes les autres URL que nous souhaitons ne permettre que 90 secondes de temps de connexion et un maximum de 4 Mo dans le corps POST.

Paramètres globaux

Tout d'abord, vous devez augmenter globalement les limites de temps et de taille pour l'ensemble du site. Tout d'abord, vous souhaitez définir le "Délai de connexion" pour l'ensemble du site. Cela agit comme une limite supérieure absolue et ne peut pas être défini à partir de web.config. Le site Web IIS7 a bonnes instructions ici . Vous pouvez également le faire par programme avec la Microsoft.Web.Administrationlibrary fournie avec 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);

Ensuite, vous devez définir la demande de taille maximale autorisée par le site. C'est à un endroit totalement différent, dans le module Request Fitlering. Ce module ne peut pas être installé par défaut sur IIS7. Encore une fois, Microsoft a de bonnes instructions pour savoir comment définir maxAllowedContentLength via l’interface graphique. C'est quelque chose que vous pouvez définir depuis Web.config:

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

Ce paramètre est évalué par rapport à l'en-tête Content-Length et les demandes dont la taille est supérieure entraîneront immédiatement un 404.13. Le paramètre est en octets et ce qui vient ensuite est en kilo-octets, très cohérent cet IIS7.

Paramètres ASP.NET

Ensuite, nous voulons limiter toutes les demandes ASP.NET à 90 secondes/4 Mo. Cela peut être fait dans le web.config:

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

Pour rendre les paramètres globaux, la balise system.web est encapsulée dans une balise location sans attribut path. (Dans la question initiale, je n'ai pas enveloppé la balise system.web dans la balise d'emplacement, qui était probablement la source de mon problème.) maxRequestLength est en kilo-octets cette fois.

Enfin, nous souhaitons autoriser notre URL de téléchargement spéciale à accepter des envois volumineux. Définir ces valeurs plus élevées que celles que vous avez définies globalement ne fonctionnera pas. Les valeurs globales remplacent ces paramètres.

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

Si tout le reste est configuré correctement, cela devrait le faire. Comme l'a suggéré Peter Bromberg, vous pouvez ajouter autant de blocs que nécessaire pour augmenter les limites d'URL spécifiques.

Une dernière remarque: en mode débogage, IIS n'applique pas les paramètres Délai de connexion ou executionTimeout afin de vous accorder plus de temps pour le débogage. Par conséquent, pour tester vos paramètres sur une machine de développement, vous devez créer une version et vous devez définir le paramètre "Activer le débogage côté serveur" sur false.

28
Gareth Farrington

Vous pouvez toujours définir le ScriptTimeout directement dans l'action de votre contrôleur. Ainsi, la configuration ne sera pas interrompue si vous modifiez votre routage.

0
jishi

Pour définir le délai d'expiration d'une page spécifique, vous pouvez utiliser autant d'éléments <web.config <chemin d'accès que nécessaire:

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

Tant que votre chemin est défini correctement et que l'extension .Rails est mappée à ASP.NET, cela devrait fonctionner. Se pourrait-il que le moteur d'exécution ASP.NET ne traite pas les extensions * .Rails?

NOTE: Quel mec éditeur de publication. Pourquoi ne pouvez-vous pas échapper à l'utilisateur?

0
Peter Bromberg