我们有一个在IIS 7下工作的MVC 3应用程序,而应用程序池管理管道模式是集成。
此应用程序突然变得不稳定,这意味着会产生如下错误。
Log Name: Application
Source: ASP.NET 4.0.30319.0
Date: 04.02.2014 12:01:16
Event ID: 1309
Task Category: Web Event
Level: Warning
Keywords: Classic
User: N/A
Computer:
Description:
Event code: 3005
Event message: An unhandled exception has occurred.
Event time: 04.02.2014 12:01:16
Event time (UTC): 04.02.2014 10:01:16
Event ID: 9896973154a54e5b88e6f1799922e853
Event sequence: 6
Event occurrence: 1
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/3/ROOT-1-130359816693915362
Trust level: Full
Application Virtual Path: /
Application Path: D:\WebSites\
Machine name: DC1VMCIFWEB02
Process information:
Process ID: 4152
Process name: w3wp.exe
Account name: NT AUTHORITY\SYSTEM
Exception information:
Exception type: NullReferenceException
Exception message: Object reference not set to an instance of an object.
at System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification notification, Boolean isPostEvent)
at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)
at System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb)
at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
这也是我们的global.asax.cs代码,我想知道这段代码有什么问题;
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
log4net.Config.XmlConfigurator.Configure();
}
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
Response.Cache.SetExpires(DateTime.Now.AddSeconds(0));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetValidUntilExpires(true);
if (HttpContext.Current.Session != null)
{
CultureInfo ci = (CultureInfo)this.Session["Culture"];
if (ci == null)
{
string langName = "tr";
if (HttpContext.Current.Request.UserLanguages != null && HttpContext.Current.Request.UserLanguages.Length != 0)
{
langName = HttpContext.Current.Request.UserLanguages[0].Substring(0, 2);
}
ci = new CultureInfo(langName);
this.Session["Culture"] = ci;
}
Thread.CurrentThread.CurrentUICulture = ci;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
}
}
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
Application[HttpContext.Current.Request.UserHostAddress.ToString()] = ex;
Class.LogClass.Error(this.GetType().ToString(), "Application_Error : ", ex);
}
答案 0 :(得分:0)
关于这一行:
Application[HttpContext.Current.Request.UserHostAddress.ToString()] = ex;
每MSDN:
应用程序状态存储在服务器的内存中,因此处于应用程序状态的大量数据可以快速填满服务器内存。如果重新启动应用程序,则应用程序状态数据将丢失。 Web场中的多个服务器之间或Web园中的工作进程之间不共享应用程序状态。最后,应用程序状态是自由线程的,因此存储在应用程序状态中的任何数据都必须具有内置的同步支持。有关这些注意事项的详细信息,请参阅ASP.NET应用程序状态概述和ASP.NET状态管理建议。
基本上,您存储的是UserHostAddress
/ Exception object
地图的全局变量列表。从本质上讲,这是自上次应用程序池回收以来访问该站点的每个IP地址的最后一个错误。由于此状态仅在应用程序池回收时被清除,因此它将像慢速内存泄漏一样。应用程序池超时时间越长,用户在某处获得异常的可能性越大,运行服务器内存的可能性就越大。
目前还不清楚为什么要将异常放入持久性位置,但如果您的意图是允许当前请求能够显示异常,则更好的选择是将其存储在HttpContext.Items
中,只会持续当前请求的生命周期。这将确保应用程序错误最终不会使服务器内存不足。
我不确定这是导致您的应用程序不稳定的原因,但它是一个很好的起点。