C# ASP.NET MVC:如何防止导致IIS应用程序池关闭的异常
我有一个应用程序,当连接到数据库失败时会抛出异常。此异常似乎会导致应用程序池在多次失败后关闭 如何捕获此异常以避免关闭应用程序池? 下面是出现异常时执行的代码C# ASP.NET MVC:如何防止导致IIS应用程序池关闭的异常,c#,asp.net-mvc,exception,C#,Asp.net Mvc,Exception,我有一个应用程序,当连接到数据库失败时会抛出异常。此异常似乎会导致应用程序池在多次失败后关闭 如何捕获此异常以避免关闭应用程序池? 下面是出现异常时执行的代码 public class CustomHandleErrorAttribute : HandleErrorAttribute { private static readonly SecureLogger log = new SecureLogger(LogManager.GetLogger(MethodBase.GetCurren
public class CustomHandleErrorAttribute : HandleErrorAttribute
{
private static readonly SecureLogger log = new SecureLogger(LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType));
public override void OnException(ExceptionContext filterContext)
{
if (!filterContext.HttpContext.IsCustomErrorEnabled)
{
return;
}
if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
{
return;
}
log.Error("Internal server error occurred while handling web request.", filterContext.Exception);
var controllerName = (string)filterContext.RouteData.Values["controller"];
var actionName = (string)filterContext.RouteData.Values["action"];
var model = new HandleErrorInfo(new Exception("Internal server error occurred while handling web request."), "Error", "Index");
filterContext.Result = new ViewResult
{
ViewName = View,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model)
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
public List<DataModel> GetStudentData(List<string> idList)
{
try
{
using (MyDBContext dbcontext = new MyDBContext())
{
return dbcontext.studentData.Where(x => idList.Contains(x.userId)).Select(
x => new DataModel
{
StudentId = x.userId,
StudentName = x.Name
}
)
?.ToList();
}
}
catch (Exception ex)
{
throw ex;
}
}
公共类CustomHandleErrorAttribute:HandleErrorAttribute
{
private static readonly SecureLogger log=new SecureLogger(LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType));
公共覆盖无效OneException(例外上下文筛选器上下文)
{
如果(!filterContext.HttpContext.IsCustomErrorEnabled)
{
返回;
}
如果(!ExceptionType.IsInstanceOfType(filterContext.Exception))
{
返回;
}
log.Error(“处理web请求时发生内部服务器错误。”,filterContext.Exception);
var controllerName=(字符串)filterContext.RouteData.Values[“controller”];
var actionName=(字符串)filterContext.RouteData.Values[“action”];
var model=newHandleErrorInfo(新异常(“处理web请求时发生内部服务器错误”),“错误”,“索引”);
filterContext.Result=新的ViewResult
{
ViewName=视图,
ViewData=新的ViewDataDictionary(模型)
};
filterContext.ExceptionHandled=true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode=(int)HttpStatusCode.InternalServerError;
filterContext.HttpContext.Response.TrySkipIisCustomErrors=true;
}
}
导致异常的代码
public class CustomHandleErrorAttribute : HandleErrorAttribute
{
private static readonly SecureLogger log = new SecureLogger(LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType));
public override void OnException(ExceptionContext filterContext)
{
if (!filterContext.HttpContext.IsCustomErrorEnabled)
{
return;
}
if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
{
return;
}
log.Error("Internal server error occurred while handling web request.", filterContext.Exception);
var controllerName = (string)filterContext.RouteData.Values["controller"];
var actionName = (string)filterContext.RouteData.Values["action"];
var model = new HandleErrorInfo(new Exception("Internal server error occurred while handling web request."), "Error", "Index");
filterContext.Result = new ViewResult
{
ViewName = View,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model)
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
public List<DataModel> GetStudentData(List<string> idList)
{
try
{
using (MyDBContext dbcontext = new MyDBContext())
{
return dbcontext.studentData.Where(x => idList.Contains(x.userId)).Select(
x => new DataModel
{
StudentId = x.userId,
StudentName = x.Name
}
)
?.ToList();
}
}
catch (Exception ex)
{
throw ex;
}
}
public List GetStudentData(List idList)
{
尝试
{
使用(MyDBContext=new MyDBContext())
{
返回dbcontext.studentData.Where(x=>idList.Contains(x.userId))。选择(
x=>新数据模型
{
StudentId=x.userId,
StudentName=x.Name
}
)
?.ToList();
}
}
捕获(例外情况除外)
{
掷骰子;
}
}
故障代码的确切位置是哪里?它是在应用程序启动时执行还是在请求时执行?@HirasawaYui更新了代码部分。它根据请求执行。但在执行过程中,数据库正在维护,因此无法连接到数据库。哦,现在我明白了。处理一个异常而不是重新触发它怎么样?您还可以尝试调整应用程序池设置,如以下所示(第二个答案)@HirasawaYui有许多具有这种结构的函数调用。所以我想知道它在哪里重新调用,这样我就可以在全局错误处理中捕捉到它来处理这种情况。