【问题标题】:How to set different Timeouts for different URLs in ASP.NET如何在 ASP.NET 中为不同的 URL 设置不同的超时时间
【发布时间】:2011-09-16 18:43:49
【问题描述】:

我希望我的应用程序中的某些 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>

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

【问题讨论】:

  • 所以在做了一堆测试之后,我相信这个配置或多或少是正确的。但是,在日志中,我收到了一些超时时间超过 480 秒的操作,这些操作尚未明确配置。我们将请求开始时间记录在 OnBeginRequest 中,然后在“System.Web.HttpException (0x80004005): Request timed out”时将结束时间记录在 OnError 中。被抛出。它达到了 1 小时的全球限制。
  • 这个问题可能是我真正想要的:stackoverflow.com/questions/4490017/…

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


【解决方案1】:

要为特定页面设置超时,您可以根据需要使用尽可能多的

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

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

注意: 伙计,多么糟糕的帖子编辑器。为什么不能为用户进行转义?

【讨论】:

  • 我正在使用这样的单轨处理程序:&lt;add name="MonoRail" path="*" verb="*" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" preCondition="integratedMode" /&gt; 我认为也许我应该做的是实现一个过滤器,该过滤器将根据放置在操作上的可选属性更改 Server.ScriptTimeout。
【解决方案2】:

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

假设我们的网站上有一个要处理文件上传的 URL。我们希望在该 URL 上接收多达 1 GB 的数据,并且我们将允许客户端最多连接 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。设置以字节为单位,接下来以千字节为单位,与 IIS7 非常一致。

ASP.NET 设置

接下来,我们要将所有 ASP.NET 请求限制为 90 秒/4MB。这可以在 web.config 中完成:

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

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

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

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

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

最后一点:在调试模式下,IIS 不会强制执行连接超时或执行超时设置,以允许您有更多时间进行调试。所以要在开发者机器上测试你的设置,你应该做一个发布版本,你应该将“启用服务器端调试”设置为false

【讨论】:

  • "将这些值设置为高于您全局设置的值是行不通的。全局值会覆盖这些设置。"嗯?您的示例在这里为所有设置 90 秒,然后为特定位置设置 3600 秒。
  • 哦,你的意思是你不能在这里设置 maxRequestLength 比在 requestFiltering 中更大。
  • 写得很好,感谢您抽出宝贵时间与我们分享您的结果。
【解决方案3】:

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

【讨论】:

  • 我喜欢这个主意,你可以用 c# 中的属性来实现。唯一的问题是您想在调用操作之前设置超时。在大量上传的情况下,仅在接收到整个文件后才调用该操作。我不知道如何让 Monorail 在执行之前告诉我它将执行哪个操作,例如在 PostAcquireRequestState 中。
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 2012-10-19
  • 2014-10-12
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多