我有一个控制器,其中包含一系列返回jsonp的操作。我的问题是,在启用自定义错误的情况下,当存在硬件服务器错误时,我的jquery ajax调用不会出现“错误”。因此,我需要为控制器禁用自定义错误重定向,或者如果必须,则为该控制器中的每个操作禁用。
当只在这些操作上发生错误时,是否有任何方法可以禁用重定向,但仍然会向客户端返回错误代码,以便ajax可以处理错误?
编辑:
我将扩展一些代码。首先,我使用配置进行自定义错误。
<customErrors mode="RemoteOnly" defaultRedirect="~/Error/ServerError">
<error statusCode="403" redirect="~/Error/AccessDenied" />
<error statusCode="404" redirect="~/Error/NotFound" />
<error statusCode="500" redirect="~/Error/ServerError" />
<error statusCode="999" redirect="~/Error/ServerError" />
</customErrors>
然后,我有自己的异常报告属性。此属性应用于实现IController的基本控制器类。我的所有控制器都从这个基本控制器继承,因此在出现服务器错误时,它们都会内置错误报告。
public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
base.OnException(context);
RaiseErrorSignal(context.Exception);
}
private static void RaiseErrorSignal(Exception ex)
{
IExceptionHandler handler = Resolve();
handler.HandleError(ex.GetBaseException());
}
private static IExceptionHandler Resolve()
{
return ServiceLocator.Locate<IExceptionHandler>();
}
}
我有一个像这样的方法的控制器
public JsonpResult DoSomething(string sessionId /*...more params...*/)
{
//Do work
return new JsonpResult() { Data = new { } };
}
仅在此控制器/这些操作上,我想禁用重定向,以便将错误代码返回给客户端。仍然需要抛出错误,但不知何故,自定义错误模式需要仅针对此请求更改为“关闭”,并且仅更改为请求的持续时间。
答案 0 :(得分:3)
我接受了@frennky提供的答案并稍微扩展了一下。我正在设置HTTP响应代码并让jQuery端的错误处理程序处理它。
在我的情况下,我正在使用遗留的webforms应用程序进行集成,该应用程序使用ASP.NET自定义错误页面来捕获我的所有错误。所有的异常都被吞噬了,jQuery AJAX调用似乎正常完成。自定义错误页面的HTML被返回到我的jQuery AJAX成功函数。我想要一种方法来利用jQuery提供的错误处理。这种方法实现了这一目标。
这是我的自定义HandleErrorAttribute:
public class HandleAjaxErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
base.OnException(filterContext);
return;
}
else
{
//Log the error here.
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
filterContext.HttpContext.Response.StatusDescription = filterContext.Exception.Message;
}
}
}
这是我在jQuery AJAX请求失败时调用的Javascript函数(本例简化):
function HandleAjaxError(jqXHR, textStatus, errorThrown) {
alert(jqXHR.statusText);
}
答案 1 :(得分:1)
如果这些是ajax调用,你可以尝试这样的事情:
public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
base.OnException(context);
RaiseErrorSignal(context.Exception);
}
else
{
//Respond to ajax call with error message
}
}
//...
}