2

我正在使用 (C#) 和 (ASP.NET Web API) 和 MS SQL 2008 R2 开发 Web 应用程序,并在 Windows Server 2008 的 IIS7 上托管,所有 API 都以 JSON 格式返回数据

当我从任何网络浏览器调用任何 API 并在第一次调用完成之前刷新页面以再次调用时,它会在事件查看器中给我警告,并且在 0 到 5 分钟后 II7 中的工作进程停止了大约 2 分钟(挂起)和在这 2 分钟内来自所有用户的所有 API 调用都不起作用,事件查看器给我一个错误:

事件查看器中的警告

Event code: 3005 
Event message: An unhandled exception has occurred. 
Event time: 6/5/2012 3:29:10 PM 
Event time (UTC): 6/5/2012 1:29:10 PM 
Event ID: 63adcb812864465cab58e9f870bcbb92 
Event sequence: 5 
Event occurrence: 1 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/2/ROOT/AAA-2-129833765408950000 
    Trust level: Full 
    Application Virtual Path: /AAA
    Application Path: C:\inetpub\wwwroot\AAA\ 
    Machine name: MyMachine

Process information: 
    Process ID: 9860 
    Process name: w3wp.exe 
    Account name: NT AUTHORITY\NETWORK SERVICE 

Exception information: 
    Exception type: HttpException 
    Exception message: The remote host closed the connection. The error code is 0x800704CD.
   at System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)



Request information: 
    Request URL: My API URL
    Request path: API Path 
    User host address: My IP 
    User:  
    Is authenticated: False 
    Authentication Type:  
    Thread account name: NT AUTHORITY\NETWORK SERVICE 

Thread information: 
    Thread ID: 8 
    Thread account name: NT AUTHORITY\NETWORK SERVICE 
    Is impersonating: False 
    Stack trace:    at System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

事件查看器中的错误

An unhandled exception occurred and the process was terminated.

Application ID: /LM/W3SVC/2/ROOT/AAA

Process ID: 9860

Exception: System.AggregateException

Message: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread.

StackTrace:    at System.Threading.Tasks.TaskExceptionHolder.Finalize()

InnerException: System.Web.HttpException

Message: The remote host closed the connection. The error code is 0x800704CD.

StackTrace:    at System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

背后的代码

公共类内容控制器:ApiController { 动态 json = new JsonObject();

    // GET /api/v1/content      
    [HttpGet]
    public IEnumerable<ME_API_V1.Models.Content> GetContent()
    {
        Request.Headers.Add("Accept", "application/json");
        List<ZMSLibrary.ME.Models.Content> contentList = new List<ZMSLibrary.ME.Models.Content>() ;
        try
        {
            //DateTime CurrentDateTime = DateTime.Now;

            var querystring = this.Request.RequestUri.Query;
            var parameters = HttpUtility.ParseQueryString(querystring);

            string userID = parameters["userID"];
            string countryCode = parameters["countryCode"];
            string language = parameters["language"];
            string categoryName = parameters["categoryName"];
            string subcategoryID = parameters["subcategoryID"];
            string count = parameters["count"];
            string start = parameters["start"];
            string platform = parameters["platform"];
            string imageSize = parameters["imageSize"];



            //Check IP Restiriction
            Restriction restiriction = new Restriction(ConfigurationManager.ConnectionStrings["AppSQLConnection"].ToString());
            bool allowedCheck = restiriction.IsUserAllowed(userID);
            if (!allowedCheck)
            {
                dynamic json = new JsonObject();
                json.message = "Authorized Only for Mobinil in Egypt";
                var msg = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden);
                msg.Content = new StringContent(json.ToString());
                msg.Content.Headers.ContentType.MediaType = "application/json";
                throw new HttpResponseException(msg);
            }
            else
            {



                //Validate input data
                if (InputValidation.isValidUserid(userID) &&
                    InputValidation.isValidCountryCode(countryCode) &&
                    InputValidation.isValidLanguage(language) &&
                    InputValidation.isValidCategory(categoryName) &&
                    InputValidation.isValidUserid(subcategoryID) &&
                    InputValidation.isValidPlatform(platform)
                    )
                {
                    if (!InputValidation.isValidImageSize(imageSize))
                    {
                        imageSize = "high";
                    }

                    if (!InputValidation.isValidUserid(count) || !InputValidation.isValidUserid(start))
                    {
                        start = WebConfigurationManager.AppSettings["DefaultStart"];
                        count = WebConfigurationManager.AppSettings["DefaultCount"];
                    }

                    ContentOperations contentOperations = new ContentOperations();
                    contentList = contentOperations.getContent(subcategoryID, categoryName, count, start, countryCode, userID, ConfigurationManager.ConnectionStrings["AppSQLConnection"].ToString(), WebConfigurationManager.AppSettings["FileFolderName"], imageSize, language, platform);
                    if (contentList != null)
                    {
                        List<ME_API_V1.Models.Content> contentOutputList = new List<ME_API_V1.Models.Content>();
                        foreach (ZMSLibrary.ME.Models.Content c in contentList)
                        {
                            File tempFile = new File();
                            ME_API_V1.Models.Content cTemp = new ME_API_V1.Models.Content();
                            cTemp.contentID = int.Parse(c.ContentID);
                            if (c.Rating == "1")
                                cTemp.userRating = "Like";
                            else if (c.Rating == "0")
                                cTemp.userRating = "Dislike";

                            cTemp.date = String.Format("{0:G}", c.ContentDate);

                            //if (c.Provider.ContentProviderName != "")  //to make the value null instead of ""
                            cTemp.providerName = c.Provider.ContentProviderName;
                            //if (c.Provider.ContentProviderIcon != "")
                            cTemp.providerIconURL = c.Provider.ContentProviderIcon;
                            //if (c.Provider.ContentProviderImage != "")
                            cTemp.providerImageURL = c.Provider.ContentProviderImage;

                            if (language == "AR")
                            {
                                //if (c.ContentArabicTitle != "")
                                cTemp.title = c.ContentArabicTitle;
                                //if (c.ContentArabicSubTitle != "")
                                cTemp.subtitle = c.ContentArabicSubTitle;
                                //if (c.ContentArabicDescription != "")
                                cTemp.description = c.ContentArabicDescription;
                            }
                            else
                            {
                                //if (c.ContentEnglishTitle != "")
                                cTemp.title = c.ContentEnglishTitle;
                                //if (c.ContentEnglishSubTitle != "")
                                cTemp.subtitle = c.ContentEnglishSubTitle;
                                //if (c.ContentEnglishDescription != "")
                                cTemp.description = c.ContentEnglishDescription;
                            }

                            if (categoryName == "Music")
                            {
                                foreach (ContentFile cf in c.ContentFiles)
                                {
                                    if (cf.FileType.FileTypeName == "Icon")
                                        tempFile.iconURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Image")
                                        tempFile.imageURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Clip_High")
                                        tempFile.highVideoURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Clip_Low")
                                        tempFile.lowVideoURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Tone")
                                        tempFile.toneURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Song")
                                        tempFile.songURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "YouTube")
                                        tempFile.youtubeID = cf.ContentFileName;

                                }

                            }
                            else if (categoryName == "News")
                            {
                                foreach (ContentFile cf in c.ContentFiles)
                                {
                                    if (cf.FileType.FileTypeName == "Icon")
                                        tempFile.iconURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Image")
                                        tempFile.imageURL = cf.ContentFileName;

                                }

                            }
                            else if (categoryName == "Videos")
                            {
                                foreach (ContentFile cf in c.ContentFiles)
                                {
                                    if (cf.FileType.FileTypeName == "Icon")
                                        tempFile.iconURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Image")
                                        tempFile.imageURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Video_High")
                                        tempFile.highVideoURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Video_Low")
                                        tempFile.lowVideoURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "YouTube")
                                        tempFile.youtubeID = cf.ContentFileName;

                                }

                            }
                            else if (categoryName == "Applications")
                            {
                                foreach (ContentFile cf in c.ContentFiles)
                                {
                                    if (cf.FileType.FileTypeName == "Icon")
                                        tempFile.iconURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "Image")
                                        tempFile.imageURL = cf.ContentFileName;
                                    else if (cf.FileType.FileTypeName == "App_Android" || cf.FileType.FileTypeName == "App_Nokia" || cf.FileType.FileTypeName == "App_Blackberry" || cf.FileType.FileTypeName == "App_iPhone")
                                    {                                           
                                            tempFile.appURL = cf.ContentFileName;                                               
                                    }

                                }

                            }

                            cTemp.files = tempFile;
                            contentOutputList.Add(cTemp);
                        }
                        return contentOutputList;

                    }

                }

                if (contentList == null)
                    throw new Exception();
                else
                {
                    json.message = "Wrong or missing data";
                    var msg = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest);
                    msg.Content = new StringContent(json.ToString());
                    msg.Content.Headers.ContentType.MediaType = "application/json";
                    throw new HttpResponseException(msg);
                }
            }




        }       
        catch (Exception ex)
        {
            if (ex is HttpResponseException)
            {
                throw;
            }
            else
            {
                json.message = "Error in System";
                var msg = new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);
                msg.Content = new StringContent(json.ToString());
                msg.Content.Headers.ContentType.MediaType = "application/json";
                throw new HttpResponseException(msg);
            }
        }

    }


}
4

1 回答 1

0

我看到你有两个 foreach 循环,如果这是一个大循环,并且你的程序在那里循环堆栈,那么这就是你的挂起。

您可以尝试类似的方法来检测断开连接并停止此延迟。

foreach (ZMSLibrary.ME.Models.Content c in contentList)
{
    if (!Response.IsClientConnected){
        HttpContext.Current.Response.End();
        return;
    }

    foreach (ContentFile cf in c.ContentFiles)
    {

    }
}

另外我不知道您是否打开了会话,如果您不使用它,请将其关闭,如果您添加数据,请使用其他同步 - 例如使用互斥锁,互斥锁名称是工作的唯一代码。

关于错误信息

The remote host closed the connection.

这实际上只是说您按照您的描述进行了刷新,而没有先获取结果,所以线程完成后,并尝试将输出发送回他发现连接关闭。

于 2012-06-14T10:23:33.350 回答