Может ли наследование использоваться для подробностей ошибок WCF? - PullRequest
0 голосов
/ 10 октября 2018

В службе 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, и подумать, чтобы найти точный тип, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...