2016-04-22 4 views
1

My WebApi генерирует исключение внутреннего сервера, а в клиенте я пытаюсь десериализовать результат в исключении.Исключение исключения из строки JSON

действие контроллера делает:

try 
{ 
    //Do something... 
} 
catch (Exception ex) 
{ 
    return InternalServerError(ex); 
} 

И в клиенте я делаю:

var content = response.Content.ReadAsStringAsync().Result; 
var exception = JsonConvert.DeserializeObject<Exception>(content); 

Но исключение: 'ИмяКласса'

пользователя не было найденный.

Проверка контекста с Json2csharp, я получаю следующие объекты:

public class InnerException 
{ 
    public string Message { get; set; } 
    public string ExceptionMessage { get; set; } 
    public string ExceptionType { get; set; } 
    public string StackTrace { get; set; } 
} 

public class RootObject 
{ 
    public string Message { get; set; } 
    public string ExceptionMessage { get; set; } 
    public string ExceptionType { get; set; } 
    public string StackTrace { get; set; } 
    public InnerException InnerException { get; set; } 
} 

Итак, где ClassName приходит, и что это лучший способ десериализации исключения?

EDIT

Для сериализации исключения я создал новый класс, производный от Exception, и добавил следующий код:

protected RequestException(SerializationInfo info, StreamingContext context) 
    { 
    } 

    [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] 
    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     base.GetObjectData(info, context); 
    } 

Однако, оригинальные детали исключения, особенно внутреннее исключение, являются потерял.

+0

выглядит, что сериализованное исключение производного типа, поэтому она имеет больше свойств, чем тип исключение, для этого он не может быть десериализован таким образом - вы должны обеспечить точный тип десериализованного исключения из десериализатора –

+1

Я не знаю C#, но, как правило, вы не должны возвращать исходное исключение на стороне сервера, поскольку вы его поймаете, почему бы не вернуть что-то более удобное для пользователя, которое не подвергает вас именам классов и стеку на стороне сервера проследить? – pherris

+0

Можете ли вы опубликовать свою строку JSON? – Mainak

ответ

1

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

var content = response.Content.ReadAsStringAsync().Result; 
var response = JsonConvert.DeserializeObject<MyResponseObject>(content); 
Смежные вопросы