gpt4 book ai didi

asp.net-mvc - Azure 应用服务在 ApplicationHost.config 中设置自定义 ConnectionTimeout

转载 作者:行者123 更新时间:2023-12-03 01:51:17 24 4
gpt4 key购买 nike

在我们托管在 Azure 应用服务上的 ASP.NET MVC 网站上,我们希望对耗时超过 15 秒的请求强制超时。这是一个我们一直在测试的简单操作,总是需要超过 15 秒(即无限循环)...

    public ActionResult TimeoutTest()
{
var i = 1;
while (true)
{
i++;
}
return new HttpStatusCodeResult(200);
}

默认情况下,如果我在浏览器中对该操作执行 GET,两分钟后我将收到“500 - 请求超时”错误,这与 the "connectionTimeout" default setting in the webLimits section of ApplicationHost.config 一致。 .

所以...除非我弄错了,否则将这个connectionTimeout值更改为15秒就足够了。为此,我知道需要对 ApplicationHost.config 文件 (XDT) 使用基于转换的方法,如 here 中所述。 .

我使用以下 applicationHost.xdt 文件执行此操作...

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.applicationHost>
<webLimits xdt:Transform="SetAttributes(connectionTimeout)" connectionTimeout="00:00:15"/>
</system.applicationHost>
</configuration>

...之后我将文件添加到正确的位置(d:/home/site/applicationHost.xdt)。我重新启动了站点,并在日志中看到转换已成功应用:

2016-04-20T08:40:44 Start 'site' site extension transform
2016-04-20T08:40:44 StartSection Executing SetAttributes (transform line 4, 18)
2016-04-20T08:40:44 on /configuration/system.applicationHost/webLimits
2016-04-20T08:40:44 Applying to 'webLimits' element (no source line info)
2016-04-20T08:40:44 Set 'connectionTimeout' attribute
2016-04-20T08:40:44 Set 1 attributes
2016-04-20T08:40:44 EndSection Done executing SetAttributes
2016-04-20T08:40:44 Successful 'D:\home\site\applicationHost.xdt' site extension transform
2016-04-20T08:40:44 sandboxproc.exe complete successfully. Ellapsed = 316.00 ms

[编辑]:我还在转换后直接检查了applicationhost.config,新值就在那里:

    ...
</sites>
<webLimits connectionTimeout="00:00:15" />
</system.applicationHost>
<system.webServer>
<asp>
...

尽管如此,如果我再次点击上面的操作方法,它仍然会在两分钟而不是 15 秒后超时。

我的问题:有人知道为什么这个超时设置不被遵守吗?

我知道 this post ,看起来它采用了完全相同的方法(并且似乎有效?)。

最佳答案

通过 Web.Config 使用executionTimeout 怎么样?

<system.web>
<httpRuntime executionTimeout="30" />
<compilation debug="false" />
</system.web>

对于 MVC 项目,您应该添加以下代码以强制将值应用于请求:

System.Web.HttpContext.Current.GetType().GetField("_timeoutState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current, 1);

如果您希望每个请求都遵循此设置,您可以创建一个操作过滤器:

public class Timeoutter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
System.Web.HttpContext.Current.GetType().GetField("_timeoutState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current, 1);
base.OnActionExecuting(filterContext);
}
}

在Global.asax中调用的RegisterGlobalFilters方法中添加注册:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new Timeoutter());
filters.Add(new HandleErrorAttribute());
}

请参阅:

关于asp.net-mvc - Azure 应用服务在 ApplicationHost.config 中设置自定义 ConnectionTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36738638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com