在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());
}
}
说明:
服务协定定义了具有错误类型FaultBase的FaultContract。服务实现调用一个子系统,该子系统希望引发特定类型的故障,称为SpecificFault。由于SpecificFault问题是子系统的局部问题,因此使用FaultContract属性将其列出是不切实际的。
给出的示例代码将导致对SpecificFault类一无所知的服务和WSDL。
如果我使用已知的类型提供程序来注入SpecificFault类,则数据契约确实会显示在WSDL中。
问题在于,即使WSDL中存在SpecificFault,该异常也将作为非通用FaultException出现在客户端上,而没有对SpecificFault对象的跟踪。
问题: 是否使用已知的类型系统应该用于注入故障详细信息,但服务方法的FaultContract属性中未明确提及?
注意:我知道客户端无法使用基本故障类捕获这些异常,因为FaultException不会从FaultException继承。这个问题是关于使用正确的类型将它们发送给客户端,以便客户端可以使用特定类型或非通用FaultException捕获它,并在需要时进行反射以找到确切的类型。