Я пытаюсь выдать свое собственное исключение в 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? (Хотя я попробовал это, напрасно).
Да, вы не сможете поймать тип FaultException до тех пор, пока не укажете этот тип в договоре об обслуживании как тип ошибки:
[ServiceContract]
interface IYourService
{
[OperationContract]
[FaultContract(typeof(MyCustomException))]
SomeReturnValue YourMethodCall(SomeInputValue input);
}
Только после того, как вы сделаете это, затем вы сможете поймать и обрабатывать конкретный, обычно набранный FaultException в коде вашей клиентской стороны.
Смотрите документацию MSDN в FaultException
в этом посте блога для получения дополнительной информации об обработке ошибок WCF.
Кроме того, я лично всегда буду украшать свои классы контрактов по ошибкам атрибутом [DataContract] (и все члены, которых я хочу сериализовать с [DataMember]):
[Serializable]
[DataContract]
public class MyCustomException : ApplicationException
{ ... }