ELMAH возвращает Error.aspx, когда в вызовах AJAX происходит ошибка - PullRequest
1 голос
/ 12 октября 2010

Я использую 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

...