В службе WCF SOAP можно ли использовать механизм известных типов для правильного распространения FaultException с элементами подробностей, явно не упомянутыми в атрибуте FaultContract?
Пример:
// Basic service definition:
[ServiceContract]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypesProvider))]
public interface IService
{
[OperationContract]
[FaultContract(typeof(FaultBase))]
void Test();
}
[DataContract]
public class FaultBase
{
}
public class Service : IService
{
public void Test()
{
subsystem.Do();
}
}
// Elsewhere (in a subsystem):
[DataContract]
public class SpecificFault : FaultBase
{
}
public class Subsystem()
{
public void Do()
{
throw new FaultException<SpecificFault>(new SpecificFault());
}
}
Объяснение:
Сервисный контракт определяет FaultContract с типом ошибки FaultBase.Реализация сервиса вызывает подсистему, которая желает выбросить определенный тип ошибки с именем SpecificFault.Поскольку проблема SpecificFault является локальной для подсистемы, нецелесообразно перечислять ее с помощью атрибута FaultContract.
Приведенный пример кода приведет к созданию службы и WSDL, которые ничего не знают о классе SpecificFault.
Если я использую провайдер известных типов для внедрения класса SpecificFault, в WSDL будет отображаться дактконтракт.
Проблема заключается в том, что даже когда SpecificFault присутствует в WSDL, появится исключениена клиенте как неуниверсальном исключении FaultException без трассировки объекта SpecificFault.
Вопрос. Предполагается ли использование системы известных типов для ввода сведений об ошибках, явно не упомянутых в атрибутах FaultContract метода обслуживания?
Примечание. Мне известно, что клиент не может перехватить эти исключения, используя базовый класс ошибок, поскольку FaultException не наследуется от FaultException.Этот вопрос касается передачи их клиенту с правильным типом, чтобы клиент мог перехватить его, используя определенный тип или неуниверсальное исключение FaultException, и подумать, чтобы найти точный тип, если это необходимо.