如何为ASP.NET中的不同URL设置不同的超时

Gar*_*ton 18 asp.net iis iis-7 castle-monorail iis-7.5

我希望我的应用程序中的某些URL具有不同的连接限制.某些URL接受文件上载,并且需要具有较大的连接超时.所有其他URL都需要更小的超时,以防止拒绝服务而不浪费资源.

目前我在IIS中为整个站点设置了连接超时属性为60分钟.然后我在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>
Run Code Online (Sandbox Code Playgroud)

所以我希望这会将所有URL设置为8分钟超时,并允许WriteFile.rails URL运行60分钟.相反,允许所有URL运行60分钟.如何让IIS执行我想要的操作?

Gar*_*ton 29

该问题具体涉及超时,但也暗示设置maxRequestLength.我将尝试对这两个问题给出一个非常全面的答案(现在我花了大部分时间来解决这个问题).

假设我们的网站上有一个我们想要处理文件上传的URL.我们希望在该URL上获取最多1千兆字节的数据,我们将允许客户连接最多1小时.我们想要的所有其他URL只允许90秒的连接时间,并且POST主体中最多只有4MB.

全局设置

首先,您必须全局提高整个站点的时间和大小限制.首先,您要为整个站点设置"连接超时".这充当绝对上限,无法在web.config中设置.IIS7网站在这里很好的说明.您也可以使用IIS7/7.5附带的Microsoft.Web.Administration 以编程方式执行此操作:

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

接下来,您需要设置站点允许的最大大小请求.这与Request Fitlering模块完全不同.IIS7上默认情况下可能未安装此模块.Microsoft再次提供了有关如何通过GUI 进行设置的良好说明maxAllowedContentLength.这是您可以在Web.config中设置的内容:

<system.webServer>
    <security>
        <requestFiltering>
            <!-- Allow 1GB uploads -->
            <requestLimits maxAllowedContentLength="1073741824"></requestLimits>
        </requestFiltering>
    </security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

此设置将根据Content-Length标头进行评估,大于此的请求将立即生成404.13.设置以字节为单位,接下来是Kilobytes,这与IIS7非常一致.

ASP.NET设置

接下来,我们希望以90秒/ 4MB的速度限制所有ASP.NET请求.这可以在web.config中完成:

<location>
    <system.web>
        <httpRuntime executionTimeout="90" maxRequestLength="4096" />
    </system.web>
</location>
Run Code Online (Sandbox Code Playgroud)

要使设置全局化,system.web标记将包装在location没有path属性的标记中.(在最初的问题中,我没有在位置标记中包装system.web标记,这可能是我的问题的根源.) maxRequestLength这次以千字节为单位.

最后,我们希望允许我们的特殊上传网址接受大量上传.将这些值设置为高于您设置的值将不起作用.全局值会覆盖这些设置.

<location path="Uploads/PostFile.rails">
    <system.web>
        <httpRuntime executionTimeout="3600" maxRequestLength="1048576" />
    </system.web>
</location>
Run Code Online (Sandbox Code Playgroud)

如果其他一切设置正确,那应该这样做.正如Peter Bromberg所建议的那样,您可以根据需要添加尽可能多的块来提高特定URL的限制.

最后一点:在调试模式下,IIS不会强制执行Connection Timeout或executionTimeout设置,以便您有更多时间进行调试.因此,要在开发人员计算机上测试您的设置,您应该执行发布版本,并且应该将"启用服务器端调试"设置为false.