Я пытаюсь отправить исключения из WCF наиболее универсальным способом. Вот что я получил:Правильный способ исключения исключений из WCF
[ServiceContract]
interface IContract
{
[OperationContract]
void Foo();
}
class ContractImplementation: IContract
{
public void Foo()
{
try
{
Bar();
}
catch (Exception ex)
{
throw new FaultException<Exception>(ex, ex.Message);
}
}
}
Исключение, которое на самом деле выходит из Bar
является:
[Serializable]
class MyException : Exception
{
// serialization constructors
}
ошибка, что я вижу в протоколирования на стороне сервера ФОС:
Тип 'MyException' с данными название контракта 'MyException: http://schemas.datacontract.org/2004/07/MyException' не ожидается. Подумайте об использовании DataContractResolver или добавьте любые типы , не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, которые передаются DataContractSerializer .
То, что я пытался до сих пор:
[ServiceKnownType(typeof(MyException))]
[ServiceContract]
interface IContract
{
[FaultContract(typeof(MyException))]
[OperationContract]
void Foo();
}
Но не повезло.
Не может быть, потому что вы бросаете новый FaultException (ex, ex.Message); а не «бросать новое исключение FaultException (например, ex.Message);» ? Кроме того, исключение TDetail of FaultException не должно быть исключением –
hazzik
@hazzik: Я помещаю фактическое исключение в Деталь, потому что я хочу изменить его на стороне клиента. – Tudor