应用程序在Server 2012和IIS 8.5上意外重新启动

时间:2016-12-27 14:20:35

标签: c# asp.net session iis iis-8

用户登录并执行某些并发$.ajax会话意外过期或应用程序重新启动...

我已经检查了每个工具以了解主要原因,例如Win Event日志,IIS日志和我的自定义日志信息,但没有正确的信息....

但是经过一些谷歌搜索后,我越过this表示Inproc模式不可靠且意外的进程回收

或问题here的答案,其中说明如果您使用InProc会话状态并且AppPool旋转,则会自动重置已登录用户的所有会话。因此,请确保您使用其他方法进行会话状态,或者AppPool的空闲超时时间超过.NET会话超时。

有人可以告诉我,我错了吗?

$.ajax限制发布的数据或来自webmethod的返回字符串len的限制会导致此问题吗?

我的web.config和IIS:

<sessionState timeout="120" mode="InProc"></sessionState>

enter image description here

更新

根据我测试的内容,我可以看到应用程序重新启动而不是AppPoolw3wp

我在Application_Error中遇到异常但仍无法知道

   void Application_Error(object sender, EventArgs e)
    {
        _logging = new Logging(Global.LogPath);
        Exception exp = Server.GetLastError();
        _logging.Log(LoggingMode.Error, "An error accured through the application, EX{0}", exp.ToString());
    }

我也遵循this link并做了所说的但没有什么不同。

更新

在另一边我有一个通用的处理程序来处理一些$.ajax请求(并发请求)

  public override void ProcessRequest(HttpContext context)
    {
        base.ProcessRequest(context);

        HttpRequest request = context.Request;
        HttpResponse response = context.Response;
        response.ContentType = "text/plain";
        string action = request["Action"];
        switch (action)
        {
            case "LoadThumbnails":
                response.Write(LoadThumbnails(request.GetStudyUid()));
                break;
            case "LoadDetails":
                string detailsSeriesUid = request["seriesUID"];
                string detailsStartPoint = request["strStartPoint"];
                string detailsLengthPoint = request["strLenghtPoint"];
                response.Write(LoadDetails(request.GetStudyUid(), detailsSeriesUid, detailsStartPoint, detailsLengthPoint));
                break;
.
.
.

有时应用程序会在LoadThumbnails()中重新启动,有时会在LoadDetails()中重新启动。

他们可能会返回大的JSON字符串,因此重置应用程序的response.Write()是否有限制?

提前致谢。

1 个答案:

答案 0 :(得分:0)

啊哈,经过多次头痛我已经妥善解决了问题....

正如微软提到的那样,这个问题是由于磁盘I / O较高而且我有一个并发$.ajax请求从服务器获取流并将其写入wbserver HDD所以我打算在这里发布解决方案可能会帮助某人。

第1步:所以我将Application_End日志记录改进为:

 void Application_End(object sender, EventArgs e)
    {
        if (Logging == null)
            Logging = new Logging(ConfigurationManager.AppSettings["LogFile"]);
        int logLevel = Convert.ToInt32(ConfigurationManager.AppSettings["LogLevel"].ToString());
        Logging.Mode = (LoggingMode)logLevel;
        Logging.Log(LoggingMode.Error, "Application_End is running...");
        HttpRuntime runtime = (HttpRuntime)typeof(HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null);
        if (runtime == null)
        {
            Logging.Log(LoggingMode.Error, "Runtime is null...");
            return;
        }
        string shutDownMessage = (string)runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null);
        string shutDownStack = (string)runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null);
        Logging.Log(LoggingMode.Error, "Application restarted because of , Message:{0} , Stack:{1}", shutDownMessage, shutDownStack);
    }

第2步:我意外重启后的日志是:

  
    

2016-12-28 13:33:41.4791 [错误] [myApp.dll] Application_End正在运行...        2016-12-28 13:33:41.4822 [错误] [myApp.dll]应用程序因Message:IIS配置更改而重新启动         HostingEnvironment启动了关机         HostingEnvironment导致关闭,Stack:at System.Environment.GetStackTrace(Exception e,Boolean needFileInfo)            在System.Environment.get_StackTrace()            在System.Web.Hosting.HostingEnvironment.InitiateShutdownInternal()            在System.Web.Hosting.HostingEnvironment.InitiateShutdownWithoutDemand()            在System.Web.Hosting.PipelineRuntime.StopProcessing()            在System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr pHandler,RequestNotificationStatus&amp; notificationStatus)        在System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr rootedObjectsPointer,IntPtr nativeRequestContext,IntPtr moduleData,Int32 flags)        在System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr rootedObjectsPointer,IntPtr nativeRequestContext,IntPtr moduleData,Int32 flags)

  

第3步:在最后找到 IIS配置更改的Google搜索 适当的Microsoft KB about unexpected ASP.Net application shutdown

第4步:下载All supported x64-based versions of Windows Server 2012 R2软件包并将其安装在提到的服务器上。

第5步:冷静下来并感到高兴,因为问题已通过上述4个步骤得到解决!!!!

我希望它对你有用。