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

时间:2011-06-16 22:13:25

标签: asp.net iis iis-7 iis-7.5 castle-monorail

我想要在我的应用程序中为某些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>

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

3 个答案:

答案 0 :(得分:29)

该问题专门针对超时问题,但也暗示设置maxRequestLength。我将尝试对这两个问题给出一个非常全面的答案(现在我已经花了大部分时间来完成它)。

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

全局设置

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

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

接下来,您需要设置网站允许的最大大小请求。这与Request Fitlering模块完全不同。 IIS7上默认情况下可能未安装此模块。 Microsoft再次good instructions了解如何通过GUI设置maxAllowedContentLength。这是您可以在Web.config中设置的内容:

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

此设置将根据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>

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

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

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

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

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

答案 1 :(得分:0)

要设置特定页面的超时,您可以根据需要使用尽可能多的&lt;位置路径web.config元素:

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

只要您的路径定义正确,并且.rails扩展名映射到ASP.NET,这应该可行。可能是ASP.NET执行引擎没有处理* .rails扩展名吗?

注意: 男人是一个糟糕的帖子编辑。为什么不能为用户进行转义呢?

答案 2 :(得分:0)

您始终可以直接在控制器操作中设置ScriptTimeout。这样,如果您更改路由,配置就不会中断。