使用 HandleError 属性 Class 处理 Http 和 Ajax 请求的错误
Handle Errors for Http and Ajax requests using HandleError Attribute Class
我正在使用我为 http 和 ajax 修改的 HandleError 属性 处理控制器中的所有错误请求,并将它们作为 500 错误类型处理。
public class HandleExceptionsAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
return;
else
{
ErrorLogger.LogException(filterContext);
if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.Result = new JsonResult
{
Data = new
{
success = false,
message = "error",
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
{
base.OnException(filterContext);
}
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
}
}
}
并在每个控制器上使用它作为:
[HandleExceptions]
public class InvoiceController : Controller
{}
我还在 web.config 中的 customErrors 模式为:
<customErrors mode="On" >
<error statusCode="400" redirect="Home/Error400" />
<error statusCode="401" redirect="Home/Error401" />
<error statusCode="403" redirect="Home/Error403" />
<error statusCode="500" redirect="/Home/Error" />
</customErrors>
httpErrors 为:
<httpErrors errorMode="Custom" existingResponse="Replace">
<!--<remove statusCode="404" subStatusCode="-1" />-->
<error statusCode="404" path="/Home/Error404" responseMode="ExecuteURL"/>
<!--<remove statusCode="500" subStatusCode="-1" />-->
<error statusCode="500" path="/Home/Error" responseMode="ExecuteURL"/>
</httpErrors>
我的问题是,当我只是取消注释状态代码的删除标签时,它可以很好地处理 httpErrors 但不适用于 ajax 请求,因为它没有 returning 状态代码 return 是 Home/Error 页面。
但是如果我评论这个标签然后在大多数情况下 httpErrors 不是 return 错误页面但是对于我可以在 statusCode.
中获得的 ajax 请求工作正常
$.ajax({
url: "@Url.Action("SomeAction", "SomeController")",
type: "POST",
async: true,
cache: false,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
if (response.success) {
catchSuccess("Success", response.responseText);
}
else {
catchWarning("Error", response.responseText);
}
},
Error: function (ex) {
catchError("Unkown Error", "Contact the Administrator");
},
statusCode: {
500: function () {
catchError("Error 500", "Internal Server Error. Contact the Administrator");
},
403: function () {
catchError("Error 403", "Internal Server Error. Contact the Administrator");
},
404: function (response) {
catchError("Error 404", "Internal Server Error. Contact the Administrator");
}
}
});
我应该怎么做才能捕捉到双方的错误?
Ajax请求错误:我要return状态码
Http 请求错误:我想 return 从操作页面。 (Home/Error).
由于它正在运行,我将发布解决方案作为答案。
对于上述问题,而不是检查 Jquery AJAX 中的状态码检查错误。
同样的语法是
error:Function( jqXHR jqXHR, String textStatus, String errorThrown ).
尝试将输出记录到控制台或警报以检查要处理的所需结果。
如果您想处理特定响应,则抛出特定错误而不是一般错误。
我正在使用我为 http 和 ajax 修改的 HandleError 属性 处理控制器中的所有错误请求,并将它们作为 500 错误类型处理。
public class HandleExceptionsAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
return;
else
{
ErrorLogger.LogException(filterContext);
if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.Result = new JsonResult
{
Data = new
{
success = false,
message = "error",
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
{
base.OnException(filterContext);
}
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
}
}
}
并在每个控制器上使用它作为:
[HandleExceptions]
public class InvoiceController : Controller
{}
我还在 web.config 中的 customErrors 模式为:
<customErrors mode="On" >
<error statusCode="400" redirect="Home/Error400" />
<error statusCode="401" redirect="Home/Error401" />
<error statusCode="403" redirect="Home/Error403" />
<error statusCode="500" redirect="/Home/Error" />
</customErrors>
httpErrors 为:
<httpErrors errorMode="Custom" existingResponse="Replace">
<!--<remove statusCode="404" subStatusCode="-1" />-->
<error statusCode="404" path="/Home/Error404" responseMode="ExecuteURL"/>
<!--<remove statusCode="500" subStatusCode="-1" />-->
<error statusCode="500" path="/Home/Error" responseMode="ExecuteURL"/>
</httpErrors>
我的问题是,当我只是取消注释状态代码的删除标签时,它可以很好地处理 httpErrors 但不适用于 ajax 请求,因为它没有 returning 状态代码 return 是 Home/Error 页面。 但是如果我评论这个标签然后在大多数情况下 httpErrors 不是 return 错误页面但是对于我可以在 statusCode.
中获得的 ajax 请求工作正常$.ajax({
url: "@Url.Action("SomeAction", "SomeController")",
type: "POST",
async: true,
cache: false,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
if (response.success) {
catchSuccess("Success", response.responseText);
}
else {
catchWarning("Error", response.responseText);
}
},
Error: function (ex) {
catchError("Unkown Error", "Contact the Administrator");
},
statusCode: {
500: function () {
catchError("Error 500", "Internal Server Error. Contact the Administrator");
},
403: function () {
catchError("Error 403", "Internal Server Error. Contact the Administrator");
},
404: function (response) {
catchError("Error 404", "Internal Server Error. Contact the Administrator");
}
}
});
我应该怎么做才能捕捉到双方的错误? Ajax请求错误:我要return状态码 Http 请求错误:我想 return 从操作页面。 (Home/Error).
由于它正在运行,我将发布解决方案作为答案。 对于上述问题,而不是检查 Jquery AJAX 中的状态码检查错误。 同样的语法是
error:Function( jqXHR jqXHR, String textStatus, String errorThrown ).
尝试将输出记录到控制台或警报以检查要处理的所需结果。
如果您想处理特定响应,则抛出特定错误而不是一般错误。