我正在使用(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);
}
}
}
}
答案 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.
这实际上只是说你在第一次获得结果时进行了刷新,所以完成后的线程,并尝试发回输出,他发现连接关闭。