asp.net-mvc – 在MVC3中的错误 – 请求永远不会超时 在同一项目
发布时间:2020-12-15 19:12:53 所属栏目:asp.Net 来源:网络整理
导读:我在我们的生产网站上看到这个,以及一个小的测试网站,我只是为了测试这个… 基本上,似乎由mvc处理的请求永远不会超时。我在我的web.config中设置了一个executionTimeout并关闭调试模式。然后我添加了一个无限循环的thread.sleeps到一个常规aspx页面和一个
|
我在我们的生产网站上看到这个,以及一个小的测试网站,我只是为了测试这个…
基本上,似乎由mvc处理的请求永远不会超时。我在我的web.config中设置了一个executionTimeout并关闭调试模式。然后我添加了一个无限循环的thread.sleeps到一个常规aspx页面和一个mvc页面(循环是在mvc页面的控制器)。 aspx页面可靠超时(HttpException(0x80004005):请求超时。),但是mvc页面只是旋转永远没有超时。 有没有单独的设置mvc(我看过,但没有找到它们)? Do mvc请求默认不超时? 任何帮助,这将不胜感激。我会很高兴地发电子邮件发送我的小测试网站,如果它会帮助任何人。 编辑:我使用MVC3。 我的web.config的内容: <?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application,please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=.SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Enabled" value="true" />
</appSettings>
<system.web>
<httpRuntime maxRequestLength="16384" executionTimeout="30" />
<compilation debug="false" targetFramework="4.0">
<assemblies>
<add assembly="System.Web.Abstractions,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers,Version=1.0.0.0,PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing,PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc,Version=3.0.0.0,PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages,PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
<profile>
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
</providers>
</profile>
<roleManager enabled="false">
<providers>
<clear/>
<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
</providers>
</roleManager>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
解决方法
我找到了这个的原因,methinks:
此方法在WrappedAsyncResult类中,MvcHandler类通过BeginProcessRequest使用该类: public static IAsyncResult BeginSynchronous<TResult>(AsyncCallback callback,object state,Func<TResult> func,object tag)
{
BeginInvokeDelegate beginDelegate = delegate (AsyncCallback asyncCallback,object asyncState) {
SimpleAsyncResult result = new SimpleAsyncResult(asyncState);
result.MarkCompleted(true,asyncCallback);
return result;
};
EndInvokeDelegate<TResult> endDelegate = _ => func();
WrappedAsyncResult<TResult> result = new WrappedAsyncResult<TResult>(beginDelegate,endDelegate,tag);
result.Begin(callback,state,-1);
return result;
}
其中“Begin”是: public void Begin(AsyncCallback callback,int timeout)
{
bool completedSynchronously;
this._originalCallback = callback;
lock (this._beginDelegateLockObj)
{
this._innerAsyncResult = this._beginDelegate(new AsyncCallback(this.HandleAsynchronousCompletion),state);
completedSynchronously = this._innerAsyncResult.CompletedSynchronously;
if (!completedSynchronously && (timeout > -1))
{
this.CreateTimer(timeout);
}
}
if (completedSynchronously && (callback != null))
{
callback(this);
}
}
编辑:提出了一个ham-handed的方式强制MVC控制器的行动“超时”,虽然机制有点粗暴: public class TimeoutController : Controller
{
private bool _isExecuting = false;
private int _controllerTimeout = 5000;
private Thread _executingThread;
private readonly object _syncRoot = new object();
protected override void ExecuteCore()
{
_executingThread = Thread.CurrentThread;
ThreadPool.QueueUserWorkItem(o =>
{
Thread.Sleep(_controllerTimeout);
if (_isExecuting)
{
_executingThread.Abort();
}
});
base.ExecuteCore();
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
_isExecuting = true;
base.OnActionExecuting(filterContext);
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
_isExecuting = false;
base.OnActionExecuted(filterContext);
}
public int ControllerTimeout
{
get
{
int retVal;
lock(_syncRoot)
{
retVal = _controllerTimeout;
}
return retVal;
}
set
{
lock(_syncRoot)
{
_controllerTimeout = value;
}
}
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – aspx中的设计视图没有加载
- asp.net-mvc – 将ViewData传递给RenderPartial
- asp.net-mvc – Visual Studio总是能够在源代码视图而不是设
- .net – 为什么要使用asp:HyperLink
- asp.net-mvc – 模拟DataServiceQuery
- asp.net – 为什么我的jQuery UI datepicker在初始页面加载
- asp.net-mvc – TryUpdateModel与强类型方法参数
- asp.net – 无法在应用程序级别下定义元素’buildProviders
- ASP.NET MVC路由的无限URL参数
- asp.net-mvc – 从一个项目到另一个项目调用控制器
推荐文章
站长推荐
热点阅读
