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

如何在ASP.NET中为不同的URL设置不同的超时,asp.net,iis,iis-7,iis-7.5,castle-monorail,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> <

我希望我的应用程序中的一些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>
<system.webServer>
    <security>
        <requestFiltering>
            <!-- Allow 1GB uploads -->
            <requestLimits maxAllowedContentLength="1073741824"></requestLimits>
        </requestFiltering>
    </security>
</system.webServer>
<location>
    <system.web>
        <httpRuntime executionTimeout="90" maxRequestLength="4096" />
    </system.web>
</location>


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

要设置特定页面的超时,您可以使用尽可能多的设置,您可以始终在控制器操作中直接设置ScriptTimeout。这样,如果您更改路由,配置就不会中断。

这个问题专门询问超时,但也意味着设置maxRequestLength。我将尝试对这两个问题给出一个真正全面的答案(现在我已经花了一天的大部分时间来解决这个问题)

假设我们的网站上有一个URL,我们希望处理文件上传。我们希望在该URL上接收高达1 GB的数据,我们将允许客户端最多连接1小时。所有其他URL,我们希望只允许90秒的连接时间和最大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);
接下来,您需要设置站点将允许的最大大小请求。这与请求安装模块中的位置完全不同。默认情况下,此模块可能不会安装在IIS7上。同样,微软也需要了解如何通过GUI设置
maxAllowedContentLength
。这是您可以在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>
<system.webServer>
    <security>
        <requestFiltering>
            <!-- Allow 1GB uploads -->
            <requestLimits maxAllowedContentLength="1073741824"></requestLimits>
        </requestFiltering>
    </security>
</system.webServer>
<location>
    <system.web>
        <httpRuntime executionTimeout="90" maxRequestLength="4096" />
    </system.web>
</location>
要使设置成为全局设置,
system.web
标记被包装在没有
path
属性的
location
标记中。(在最初的问题中,我没有将system.web标记包装在位置标记中,这可能是我的问题的根源。)
maxRequestLength
这次以KB为单位


最后,我们希望允许我们的特殊上传URL接受大量上传。将这些值设置为高于全局设置的值是行不通的。全局值将覆盖这些设置

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

如果其他一切都设置正确,就应该这样做。正如Peter Bromberg所建议的,您可以根据需要添加任意数量的这些块,以提高特定URL的限制


最后一点注意:在调试模式下,IIS不会强制执行连接超时或executionTimeout设置,以允许您有更多的时间进行调试。因此,要在开发人员机器上测试您的设置,您应该进行发布构建,并且应该将“启用服务器端调试”设置设置为
false

我正在使用单轨处理器,如下所示:
我想我应该做的是实现一个过滤器,该过滤器将根据操作上的可选属性。我喜欢这个想法,你可以用c#中的属性来实现。唯一的问题是要在调用操作之前设置超时。在大型上载的情况下,仅在接收到整个文件后才调用该操作。我不知道如何让Monorail在执行之前告诉我它将执行哪个操作,比如在PostAcquireRequestState中。所以在做了一系列测试之后,我相信这个配置或多或少是正确的。然而,在日志中,我得到了一些需要超过480秒才能超时的操作,这些操作没有被明确地配置为这样。我们在OnBeginRequest中记录请求开始时间,然后在抛出“System.Web.HttpException(0x80004005):请求超时”时在OnError中记录结束时间。它达到了1小时的全局限制。这个问题可能是我真正想问的:“将这些值设置为高于全局设置的值是无效的。全局值会覆盖这些设置。”嗯?您的示例将特定位置的maxRequestLength设置为90秒,然后设置为3600秒。哦,您的意思是您不能将maxRequestLength设置为大于requestFiltering中的maxRequestLength。答案写得很好,感谢您抽出时间与我们分享您的结果。