IIS停止使用ASP WEB API工作

时间:2012-06-14 10:09:42

标签: asp.net asp.net-mvc-3 c#-4.0 iis-7

我正在使用(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)

代码

public class contentController:ApiController     {         dynamic 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);
            }
        }

    }


}

1 个答案:

答案 0 :(得分:0)

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

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

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

    foreach (ContentFile cf in c.ContentFiles)
    {

    }
}

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

关于错误消息

The remote host closed the connection.

这实际上只是说你在第一次获得结果时进行了刷新,所以完成后的线程,并尝试发回输出,他发现连接关闭。