c#WCF捕获Base类型的故障异常

ca_*_*cat 6 c# wcf

我一直在寻找如何在c#中找到基本故障合同类型.我希望我的所有错误契约都从一个类继承,并在MVC控制器中有一个catch(FaultException fex).

DataContracts

[DataContract]
public class BaseClass1 
{ }

[DataContract]
public class Class2 : BaseClass1 
{ }
Run Code Online (Sandbox Code Playgroud)

服务

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [FaultContract(typeof(BaseClass1))]
    [FaultContract(typeof(Class2))]  //Do I need this one?
    void ThrowClass2();
}

public class Service1 : IService1
{
    public void ThrowClass2()
    {
        throw new FaultException<Class2>(new Class2(), "Class2 Reason");
    }
}
Run Code Online (Sandbox Code Playgroud)

服务消费者

FaultTestService.Service1Client client = null;
try
{
    client = new FaultTestService.Service1Client();
    client.ThrowAmpFaults("InvalidParameter", 0);
}
catch (FaultException<Namespace.BaseClass1> fex)
{
    //DOES NOT GO IN HERE AS I WOULD EXPECT   
}
catch (FaultException fex)
{
    //Other Possible Option
    MessageFault fault = fex.CreateMessageFault();  
    var fe1 = fault.GetDetail<BaseClass1>();
    //This throws a serialization exception it needs <Class2>
}
Run Code Online (Sandbox Code Playgroud)

如果可以修复这些捕获语句中的任何一个来执行我正在寻找的内容,请告诉我.

Jas*_*aty 5

该语法在C#中不起作用.请考虑下面的"解决方法".

try
{
    throw new FaultException<DerivedClass2>(new DerivedClass2());
}
catch (FaultException fex)
{
    bool handled = false;
    Type fexType = fex.GetType();
    if (fexType.IsGenericType && fexType.GetGenericTypeDefinition() == typeof(FaultException<>))
    {
        if (typeof(BaseClass1).IsAssignableFrom(fexType.GetGenericArguments()[0]))
        {
            object detail = fexType.GetProperty("Detail").GetValue(fex, null);

            // Use detail here.

            handled = true;
        }
    }

    if (!handled)
        throw; // Don't know how to handle. Re-throw.
}
Run Code Online (Sandbox Code Playgroud)

如果我们忽略Detail == null除了构造的泛型类型匹配的异常情况,这可以简化.我还将使用C#动态关键字进一步简化它.

try
{
    throw new FaultException<DerivedClass2>(new DerivedClass2());
}
catch (FaultException fex)
{
    bool handled = false;
    Type fexType = fex.GetType();
    if (fexType.IsGenericType && fexType.GetGenericTypeDefinition() == typeof(FaultException<>))
    {
        object detail = ((dynamic)fex).Detail;
        if (detail is BaseClass1) // true for subclasses too!
        {
            // Use detail here.
        }

    }

    if (!handled)
        throw; // Don't know how to handle. Re-throw. 
}
Run Code Online (Sandbox Code Playgroud)

另一件需要考虑的事情是你是否应该使用throw new FaultException<BaseClass1>(new DerivedClass2()).这种投掷方式可以让您使用最初提供的代码.


Joh*_*ers 2

抱歉,没有办法做到这一点。和 之间没有关系FaultException<T1>FaultException<T2>仅仅是因为T1可能是 的子类T2