Это на самом деле не ответ, а лишь некоторые заметки о сериализации исключений, и я хотел получить дополнительное место для некоторого кода ...
Вы думали об использовании вместо этого 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
... Это дает ошибку?Генерирует ли он любой код?