asp.net-mvc – 为什么我的动作方法不会超时?
我有以下控制器:
[TimeoutFilter] public abstract class BaseController: Controller { } public class IntegrationTestController : BaseController { [HttpGet] public ActionResult TimeoutSeconds() { return Content(HttpContext.Server.ScriptTimeout.ToString(CultureInfo.InvariantCulture)); } [HttpGet] public ActionResult ForceTimeout() { var timeoutWindow = TimeoutFilter.TimeoutSeconds; Thread.Sleep((timeoutWindow + 5) * 1000); return Content("This should never get returned,mwahahaaa!"); } } 对于我的测试场景,我在TimeoutFilter中使用5秒的配置设置,我知道这是正常工作,因为当我的测试调用TimeoutSeconds时,我得到正确的值为5,但是当测试调用ForceTimeout时,我得到一个HTTP响应200和我的“从未退回”的文字. 和过滤器: public class TimeoutFilter : ActionFilterAttribute { internal const string TimeoutSecondsSettingsKey = "MvcActionTimeoutSeconds"; internal static int TimeoutSeconds; public TimeoutFilter() { TimeoutSeconds = int.Parse(ConfigurationManager.AppSettings[TimeoutSecondsSettingsKey]); } public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.Controller.ControllerContext.HttpContext.Server.ScriptTimeout = TimeoutSeconds; base.OnActionExecuting(filterContext); } } 解决方法
即使在用户Erik Funkenbusch建议的web.config中设置debug =“false”,也无法通过设置ScriptTimeout属性来使其工作.
<configuration> <system.web> <compilation debug="false" targetFramework="4.5"/> ... 它继续返回文本“这不应该返回”,而不是在Thread.Sleep中超时. 还值得注意的是,我还扩展了Thread.Sleep,远远超出了Server.ScriptTimeout的默认值110秒,但是最终还是返回相同的文本而不是超时. 然后我尝试在web.config中设置executionTimeout: <configuration> <system.web> <httpRuntime targetFramework="4.5" executionTimeout="5"/> ... 如果要现在向TimeoutFilter添加一个断点,您将观察到ScriptTimeout值已从web.config设置为executionTimeout值.唉,这对我来说还是不行(不管debug =“false”). 然后我遇到了关于ScriptTimeout的this link,executionTimeout没有使用与您所描述的类似设置.该帖子中的第一个回复描述了使用debug =“false”,并且还提到超时将延迟5到15秒.即使使用大的Thread.Sleep值,我仍然没有运气.本文中的第二个回复表明,executionTimeout配置设置是ScriptTimeout属性的替代(这显然是在经典ASP中使用的COM接口).此回复表明,无法设置特定的超时,而不使用您自己的超时逻辑. 此外,然后我碰到了following (more recent) link,其中第一个回复建议在MVC中关闭超时.进一步的答复表明,这是因为 该链接表明,添加以下行将允许它工作(但不在中等信任应用程序中): System.Web.HttpContext.Current.GetType().GetField("_timeoutState",System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current,1); 因此,将TimeoutFilter OnActionExecuting()更改为: public override void OnActionExecuting(ActionExecutingContext filterContext) { System.Web.HttpContext.Current.GetType().GetField("_timeoutState",1); base.OnActionExecuting(filterContext); } 并设置web.config: <configuration> <system.web> <compilation debug="false" targetFramework="4.5"/> <httpRuntime targetFramework="4.5" executionTimeout="5"/> ... 允许超时工作,但在第一篇文章中提到了稍微延迟5秒. 注意:使用此方法不允许您在过滤器中设置ScriptTimeout属性.尝试设置ScriptTimeout并覆盖web.config中设置的值似乎不起作用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 当页面用鼠标悬停在元素上时,jQuery触发鼠标悬停
- 编写除WebForms或MVC之外的ASP.NET框架?
- 为什么我的客户端去服务器来检查在使用ASP.NET MVC包时是否
- asp.net-mvc – SimpleMembershipProvider不会在WebSecurit
- ASP.NET Core 2.0仅在共享文件夹中查找视图
- ASP.NET MVC 2加载部分视图使用jQuery – 没有客户端验证
- .net – 应用程序池限制
- ASP.NET中没有会话状态的用户身份验证
- asp.net-mvc – 使用MVC为iPhone应用构建RESTful API – 如
- asp.net – CKEditor MVC 3实现
- asp.net-mvc – 为什么ASP.NET MVC上的控制器基于
- asp.net – 在DB或文件中保存长详细信息?
- asp.net – (客户端)禁用提交按钮的最佳方法是什
- ASP.NET – 在屏幕底部显示应用程序生成日期/信息
- asp.net-mvc – 将viewdata传递给asp.net mvc ma
- 如何单元测试我的asp.net-mvc控制器的OnActionEx
- asp.net-mvc – 从ASP.NET MVC 1迁移到ASP.NET M
- ASP.NET MVC5 OWIN Facebook身份验证突然无法正常
- asp.net – FF和IE不从CSS加载img src
- asp.net-mvc – 如何通过Resharper 8.2.1停止INC