3

我们有一个在 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);
        }
4

1 回答 1

0

关于这条线:

Application[HttpContext.Current.Request.UserHostAddress.ToString()] = ex;

根据MSDN

应用程序状态存储在服务器的内存中,因此应用程序状态的大量数据会很快填满服务器内存。如果应用程序重新启动,应用程序状态数据将丢失。应用程序状态不会在 Web 场中的多个服务器之间或 Web 园中的工作进程之间共享。最后,应用程序状态是自由线程的,因此存储在应用程序状态中的任何数据都必须具有内置的同步支持。有关这些注意事项的详细信息,请参阅 ASP.NET 应用程序状态概述和 ASP.NET 状态管理建议。

基本上,您存储的是UserHostAddress/Exception object映射的全局变量列表。本质上,这是自上次应用程序池回收以来访问该站点的每个 IP 地址的最后一个错误。由于此状态仅在应用程序池回收时才被清除,因此它就像缓慢的内存泄漏一样。您的应用程序池超时时间越长,用户在某处获得异常的可能性就越大,您就越有可能将服务器运行到内存不足。

目前尚不清楚为什么要将异常放入持久位置,但如果您的意图是允许当前请求能够显示异常,则更好的选择是将其存储在 中HttpContext.Items,这只会持续当前的生命周期要求。这将确保应用程序错误最终不会导致服务器内存不足。

我不确定这是导致您的应用程序不稳定的原因,但这是一个很好的起点。

于 2015-02-28T13:23:37.410 回答