Question

Je souhaite des limites de connexion différentes pour certaines URL de mon application.Certaines URL acceptent les téléchargements de fichiers et doivent avoir un délai de connexion important.Toutes les autres URL nécessitent un délai d'expiration beaucoup plus court pour éviter le déni de service et ne pas gaspiller de 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 cela mettrait toutes les URL à un délai d'expiration de 8 minutes et permettrait à l'URL WriteFile.rails de fonctionner pendant 60 minutes.Au lieu de cela, TOUTES les URL sont autorisées à s'exécuter pendant 60 minutes.Comment faire en sorte qu'IIS fasse ce que je veux?

Était-ce utile?

La solution

La question concernait spécifiquement les délais d'expiration, mais impliquait également la définition de maxRequestLength. Je vais essayer de donner une réponse vraiment complète à ces deux problèmes (maintenant que j'ai passé la majeure partie de la journée à y remédier).

Disons que nous avons une seule URL sur notre site Web pour laquelle nous voulons traiter les téléchargements de fichiers. Nous voulons absorber jusqu'à un gigaoctet de données sur cette URL et nous autoriserons les clients à se connecter pendant au plus 1 heure. Pour toutes les autres URL, nous souhaitons n'autoriser que 90 secondes de temps de connexion et un maximum de 4 Mo dans le corps du POST.

Paramètres généraux

Vous devez d'abord augmenter globalement les limites de temps et de taille pour l'ensemble du site. Tout d'abord, vous voulez 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 contient de bonnes instructions ici . Vous pouvez également le faire par programme avec la bibliothèque Microsoft.Web.Administration livré 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 dans un endroit totalement différent, dans le module Request Fitlering. Ce module peut ne pas être installé par défaut sur IIS7. Encore une fois, Microsoft a bonnes instructions sur la façon de définir le maxAllowedContentLength via le GUI. C'est quelque chose que vous pouvez définir à partir de 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 plus grandes que cela 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 requêtes 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 enveloppée dans une balise location qui n'a pas d'attribut path. (Dans la question d'origine, je n'ai pas inclus 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 de gros téléchargements. La définition de ces valeurs supérieures à celles que vous définissez 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 bien configuré, cela devrait suffire. Comme Peter Bromberg l'a suggéré, vous pouvez ajouter autant de ces blocs que nécessaire pour augmenter les limites pour des URL spécifiques.

Une dernière remarque: en mode débogage, IIS n'applique pas les paramètres Connection Timeout ou executionTimeout, pour vous laisser plus de temps pour le débogage. Donc, pour tester votre paramètre sur une machine de développement, vous devez faire une version de version et vous devez définir le paramètre «Activer le débogage côté serveur» sur false.

Autres conseils

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

Pour définir le délai d'expiration d'une page spécifique, vous pouvez utiliser autant d'éléments

<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 sur ASP.NET, cela devrait fonctionner.Se pourrait-il que le moteur d'exécution ASP.NET ne traite pas les extensions * .rails?

REMARQUE: Homme quel rédacteur de poste nul.Pourquoi ne pouvez-vous pas échapper à l'utilisateur?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top