DataContract, который включает в себя исключение - PullRequest
3 голосов
/ 09 сентября 2011

У меня есть класс (со свойствами и некоторыми методами)

[DataContract]
public partial class AbstractApplicationCallDto
{
    [IgnoreDataMember]
    private Exception exception;

    [DataMember]
    private string exceptionString;

    [DataMember]
    private string sessionId = null;

    [DataMember]
    private MyType myType = null;
}

Когда я добавляю IgnoreDataMember в поле с типом Exception, я могу без проблем сгенерировать код для клиента. Но если добавить DataMember, ничего не генерируется.

Так почему? Как можно добавить тип Exception к DataContract?

Ответы [ 2 ]

4 голосов
/ 09 сентября 2011

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

Вы думали об использовании вместо этого FaultContracts?http://msdn.microsoft.com/en-us/library/ms733721.aspx

Несмотря на то, что тип Exception является сериализуемым, часто все, что установлено в его поле _data, не сериализуемо и иногда вызывает проблему сериализации. См. Здесь. Обходной путь для этого состоит в том, чтобы задать для поля _data значение null перед сериализацией:

        Exception ex = error;
        FieldInfo fieldInfo = typeof(Exception).GetField("_data", BindingFlags.Instance | BindingFlags.NonPublic);
        while (ex != null)
        {
            fieldInfo.SetValue(ex, null);
            ex = ex.InnerException;
        }

Другая проблема заключается в том, что при добавлении типа Exception к DataContract,вы рассматриваете дело только для фактического Exception экземпляра:

AbstractApplicationCallDto.Exception = new Exception();

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

AbstractApplicationCallDto.Exception = new NullReferenceException();

Чтобы это работало, вам нужно добавить атрибут [KnownType] в контракт с данными, чтобы вы получили что-то вроде:

[DataContract]
[KnownType(typeof(NullReferenceException))]
[KnownType(typeof(InvalidOperationException))]
[KnownType(typeof(ApplicationException))]
[KnownType(typeof(...))] // add one for every type of exception you might need to serialize back, or that might be contained in Exception.InnerException
public partial class AbstractApplicationCallDto
{
    ...

Вернемся к исходному вопросу, но я не могу вспомнитьпричина, по которой инструмент генерации клиента не может генерировать что-либо, когда в контракте есть тип Exception ... Это дает ошибку?Генерирует ли он любой код?

1 голос
/ 29 июля 2013

У меня тоже была эта проблема;Мне удалось обойти это, сделав тип поля ExceptionDetail и используя его для обтекания объекта Exception.Пример:

[DataContract]
public class WebServiceFault
{
    public WebServiceFault(Exception ex)
    {
        Message = ex.Message;
        InnerException = new ExceptionDetail(ex);
    }

    [DataMember]
    public string Message
    {
        get;
        private set;
    }

    [DataMember]
    public ExceptionDetail InnerException
    {
        get;
        private set;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...