Пользовательское исключение как деталь в исключении отказа

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

Мое пользовательское исключение:

[Serializable] public class MyCustomException : ApplicationException 
{ ... }

Вот то, как я бросаю его:

throw new FaultException<MyCustomException>(new MyCustomException("foo bar!"));

(Обратите внимание, что я действительно имею [FaultContract (typeof (MyCustomException))] помещенный над моим методом в интерфейсе),

И вот то, как я пытаюсь поймать его в своем клиенте:

...
catch (FaultException<MyCustomException> mcex)
{
    Console.WriteLine(mcex); 
}
 catch (FaultException fex) 
{
    Console.WriteLine(fex); 
}

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

Любопытная вещь состоит в том, что, если я заменяю MyCustomException ApplicationException затем действительно, FaultException правильно пойман.

Я предполагаю, что проблема состоит в том, что MyCustomException сериализируется сериализуемое (а не через DataContractSerializer) и что, возможно, я пропускаю некоторую дополнительную директиву к WCF. Что-то в строке атрибута ServiceKnownType? (Хотя я попробовал это, напрасно).

5
задан urig 26 January 2010 в 17:01
поделиться

1 ответ

Да, вы не сможете поймать тип FaultException до тех пор, пока не укажете этот тип в договоре об обслуживании как тип ошибки:

[ServiceContract]
interface IYourService
{
   [OperationContract]
   [FaultContract(typeof(MyCustomException))]
   SomeReturnValue YourMethodCall(SomeInputValue input);
}

Только после того, как вы сделаете это, затем вы сможете поймать и обрабатывать конкретный, обычно набранный FaultException в коде вашей клиентской стороны.

Смотрите документацию MSDN в FaultException в этом посте блога для получения дополнительной информации об обработке ошибок WCF.

Кроме того, я лично всегда буду украшать свои классы контрактов по ошибкам атрибутом [DataContract] (и все члены, которых я хочу сериализовать с [DataMember]):

[Serializable] 
[DataContract]
public class MyCustomException : ApplicationException 
{ ... }
3
ответ дан 15 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: