首页 > 解决方案 > ASP.NET MVC:如何防止导致 IIS 应用程序池关闭的异常

问题描述

我有一个应用程序,当连接数据库失败时会抛出异常。似乎此异常导致应用程序池在多次失败后关闭。

如何捕获此异常以不关闭应用程序池?下面是出现异常时执行的代码

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;
    }
}

标签: c#asp.net-mvcexception

解决方案


推荐阅读