Объект исключения не сериализуется в конструкторе JsonResult - PullRequest
1 голос
/ 05 января 2020

В моем ASP. NET Базовом контроллере WebAPI, когда я передаю объект исключения в JsonResult, он, похоже, не распознает ни одно из свойств исключения и не заполняет их соответствующим образом (он просто возвращает 500 без текста ). Однако, когда я создаю новый анонимный объект и передаю его, он возвращает 500 с тем, что вы ожидаете. Кажется, что у него есть большая проблема с отображением объекта исключения напрямую и полностью. Мне интересно, есть ли проблема / опция конфигурации.

[HttpGet]
public IActionResult GetSomething()
{
    try
    {
        throw new Exception("hey");
    }
    catch (Exception e)
    {
        // the following does not work as expected
        return new JsonResult(e)
        {
            StatusCode = StatusCodes.Status500InternalServerError
        };

        // the following works as expected
        return new JsonResult(new { Message = e.Message })
        {
            StatusCode = StatusCodes.Status500InternalServerError
        };
    }
}

Ответы [ 2 ]

1 голос
/ 05 января 2020

Когда вы передаете весь объект Exception, он пытается сериализовать его в Json, включая все вложенные объекты. Возможно, что сериализация просто превышает максимальную глубину и выдает исключение.
В любом случае, я бы сказал, что не рекомендуется возвращать клиенту весь Exception, поскольку вы можете раскрыть конфиденциальную информацию. Лучше отправлять только то, что может понадобиться клиенту.

0 голосов
/ 05 января 2020

Следующее представляется разумным решением. Создайте свой собственный класс, который принимает объект Exception в конструкторе, и избегайте попыток скопировать свойство TargetSite.

return new JsonResult(new { Exception = new ExceptionMapper(e) })
{
    StatusCode = StatusCodes.Status500InternalServerError
};
...