После удара в правильном направлении и дальнейшего рытья я обнаружил, что эта проблема была двойной.
Сначала Дейв Уорд на самом деле указал мне в правильном направлении в предложении я отключаю customErrors
в web.config.На самом деле это было не так, но очень близко.
Фактический виновник - модуль обработки ошибок Elmah .После его отключения я смог передавать пользовательские ошибки независимо от того, был customErrors
on
или off
.
Вторая проблема заключалась в том, что, хотя теперь я мог обрабатывать ошибки, я все равно не мог пройтиSystem.Exception
объектов.Я обнаружил, что это потому, что свойство Exception.TargetSite
не сериализуемо .
Я решил эту проблему, создав собственный класс JsonException
и включив в него только сериализуемые свойства класса System.Exception
(здесь для краткости сокращенно).
public class JsonException
{
public string Source { get; set; }
public string Message { get; set; }
public string StackTrace { get; set; }
public JsonException(Exception ex)
{
this.Source = ex.Source;
this.Message = ex.Message;
this.StackTrace = ex.StackTrace;
}
}
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public object TestError()
{
try
{
throw new Exception("Testing error");
}
catch (Exception ex)
{
return new JsonException(ex);
}
}
И вот, наконец, я получаю нужные данные: