如何使用HttpResponseMessage HttpStatusCode分隔web.config httpErrors

时间:2017-02-26 19:07:15

标签: asp.net-mvc error-handling

我正在使用asp.net mvc

开发一个应用程序

我发送ajax post请求。

在操作期间发生错误时,我会收到500个状态代码。

此方案是正确的,但web.config文件中的代码会重定向到错误页面。

这是我的代码

    public class ErrorHandler : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            var response = filterContext.RequestContext.HttpContext.Response;

            filterContext.ExceptionHandled = true;

            response.StatusCode = (int)HttpStatusCode.InternalServerError;

            filterContext.Result = new JsonResult
            {
                Data = new {

                    success = false
                },

                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
        }
    }

Web.Config

<httpErrors existingResponse="Replace" defaultResponseMode="ExecuteURL" errorMode="Custom">
      <remove statusCode="500"/>
      <error statusCode="500" path="/common/error" responseMode="Redirect"/>
    </httpErrors>

1 个答案:

答案 0 :(得分:0)

一点建议

如果发生异常,您不应始终将response.StatusCode设置为HttpStatusCode.InternalServerError。尝试并且更具体,因此您并不总是返回500.如果您返回不同的,更具体的错误代码,那么根据您的web.config,将不会发送重定向。例如,如果错误是因为ajax请求具有特定id的用户并且该用户不存在,则返回错误代码404.

现在要解决您的问题,您可以这样做:

if (filterContext.HttpContext.Request.IsAjaxRequest())
{
    CallbackException error = new CallbackException();
    error.message = errorMessage;
    error.isCallbackError = true;
    error.stackTrace = stackTrace;

    JSONSerializer Serializer = new JSONSerializer();
    string result = Serializer.Serialize(error);

    var response = filterContext.RequestContext.HttpContext.Response;
    response.ContentType = ControlResources.STR_JsonContentType;

    response.TrySkipIisCustomErrors = true;
    response.StatusCode = 500;
    response.Write(Result);
    HttpContext.Current.ApplicationInstance.CompleteRequest();
}
else
{
    // The code in your answer goes here
}

如果感兴趣,请参阅this文章了解详情。