Asp.net mvc 扩展HandleError属性-状态代码112031(连接重置)

Asp.net mvc 扩展HandleError属性-状态代码112031(连接重置),asp.net-mvc,error-handling,Asp.net Mvc,Error Handling,我创建了一个新类,该类继承自HandleErrorAttribute,以不同方式处理ajax请求。唯一的覆盖是在OneException方法上: public override void OnException(ExceptionContext filterContext) { if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) { fi

我创建了一个新类,该类继承自HandleErrorAttribute,以不同方式处理ajax请求。唯一的覆盖是在OneException方法上:

    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            filterContext.Result = new JsonResult { Data = errorText };
            return;
        }
        base.OnException(filterContext);
    }
这确实有效,大约有一半的时间。当它工作时,响应中的状态代码为500,并提供错误消息。否则,状态代码为12031,错误消息为空

显然,状态代码12031是指:

错误\u INTERNET\u连接\u重置 与服务器的连接已重置


不知道为什么会发生这种情况。

我不确定这里到底发生了什么,但我可以做出有根据的猜测。我们做了一些非常类似的事情,除了我们首先调用base.OnException,然后测试filterContext.ExceptionHandled以查看基本筛选器是否处理了异常。这对我们来说一直都很有效,而且与您所做的不同。请注意,基本筛选器并不总是处理异常(有关详细信息,请参阅源代码)

请注意,基本筛选器执行筛选器不执行的操作,如test IsCustomErrorEnabled和特定类型的异常。有一些不应处理的例外情况;同样,请参阅MVC源代码以了解有关此方面的详细信息


因此,我的猜测是,在某些情况下,您的过滤器(当有AJAX请求时,它总是处理异常)和基础过滤器会做不同的事情。我建议您尝试我们正在使用的方法(首先调用base,并且仅当请求是AJAX请求且base已指示应处理异常时才执行自定义AJAX处理),然后看看这是否对您更有效。

尝试了您的建议。仍然不起作用。我注意到,只有在从action方法中抛出异常时,我才能重现这个问题。