throw new FaultException<Exception>
не совсем то, как система ошибок WCF предназначена для использования.Указанный вами тип сериализуется по проводам в элементе <Detail>
ошибки SOAP.Обычно этот тип является классом контракта данных WCF, который вы пишете, например,
[DataContract]
public class MyFault {
[DataMember]
public string Message {get; set;}
}
throw new FaultException<Exception>
работает, потому что Exception
равен [Serializable]
, а DataContractSerializer
способен обрабатывать [Serializable]
типы, а также [DataContract]
типы.
Однако у этого подхода есть серьезные ограничения.DataContractSerializer
не очень хорошо обрабатывает типы [Serializable]
.Только поля примитивных типов (string
, int
и т. Д.) Будут передаваться корректно.Это почти нормально для очень простого типа исключения, но для сложного типа, такого как SqlException
, этого недостаточно.
Мое предлагаемое решение: создайте свой собственный выделенный контракт данных для передачи данных изSqlException
, что вам нужно, затем бросьте это вместо этого.Фактически, делайте это для всех типов исключений, это более безопасно и более эффективно.Я использую Enterprise Library Exception Shielding для автоматической обработки.Все, что возвращается клиенту, - это одно значение GUID, идентифицирующее данные об ошибках в журнале сервера.
В качестве альтернативы, если вы решили пойти по пути исключения, см. эту подробную статью .