Я использую ELMAH для регистрации ошибок. Я расширяю атрибут HandleError своим собственным, который позволяет ELMAH обрабатывать все ошибки. Насколько я понимаю, ELMAH вернет Error.aspx в браузер после того, как ошибка будет зарегистрирована. Это хорошо, за исключением вызовов Ajax. Мой клиент ожидает исключение, возвращаемое как JSON, если что-то происходит во время вызова Ajax. Для AjaxRequests, как заставить ELMAH возвращать исключение вместо возврата Error.aspx?
Вот как я расширяю HandleError:
public class ProspectorHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
base.OnException(context);
if (context.HttpContext.Request.IsAjaxRequest())
{
var innerExceptionMessage = (context.Exception.InnerException != null) ? context.Exception.InnerException.Message : String.Empty;
context.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
context.Result = new JsonResult
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new
{
context.Exception.Message,
context.Exception.StackTrace,
innerExceptionMessage
}
};
context.ExceptionHandled = true;
LogException(context.Exception);
}
else
{
var e = context.Exception;
if (!context.ExceptionHandled // if unhandled, will be logged anyhow
|| RaiseErrorSignal(e) // prefer signaling, if possible
|| IsFiltered(context)) // filtered?
return;
LogException(e);
}
}
private static bool RaiseErrorSignal(Exception e)
{
var context = HttpContext.Current;
if (context == null)
return false;
var signal = ErrorSignal.FromContext(context);
if (signal == null)
return false;
signal.Raise(e, context);
return true;
}
private static bool IsFiltered(ExceptionContext context)
{
var config = context.HttpContext.GetSection("elmah/errorFilter")
as ErrorFilterConfiguration;
if (config == null)
return false;
var testContext = new ErrorFilterModule.AssertionHelperContext(
context.Exception, HttpContext.Current);
return config.Assertion.Test(testContext);
}
private static void LogException(Exception e)
{
var context = HttpContext.Current;
ErrorLog.GetDefault(context).Log(new Error(e, context));
}
}
}
При использовании приведенного выше кода, я получаю следующую ошибку на клиенте:
Ошибка выполнения дочернего запроса для обработчика 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerWrapper'.
Это говорит мне о том, что ELMAH пытается вернуть Error.aspx, который является строго типизированным представлением, и я не предоставляю представлению правильные данные.
Как заставить ELMAH возвращать исключение вместо вызова Error.aspx? Я использую jQuery для отправки запросов AJAX на сервер.
Спасибо
Tom