捕获特定的WCF FaultException
本文关键字:WCF FaultException | 更新日期: 2023-09-27 18:09:27
单层应用程序可以通过以下方式区分异常:
Exception ex;
if (ex is System.DirectoryServices.AccountManagement.PasswordException)
...
,其中ex只是一个泛型异常。
当你转向多层的WCF时,你失去了所有这些,你需要使用FaultException机制。
问题是我找不到任何方法来做上述的事情。
在我的客户端中,我想捕获FaultException类型,然后区分它们,例如:
catch (FaultException ex)
{
if FaultException is (PasswordExceptionFault)
...
etc
}
有办法做到这一点吗?
否则,我必须有许多catch构造-每种类型的FaultException一个。
当使用WCF服务时,您必须使用FaulException,因为它是处理错误的本机Soap方法(Exception也不可序列化)。
在典型的场景中,您将首先在每个操作契约上添加类型化的FaultContract。
// NOTE: This is the std wcf template
[ServiceContract]
public interface IService1
{
[FaultContract(typeof(int))]
[FaultContract(typeof(string))]
[FaultContract(typeof(DateTime))]
[OperationContract]
string GetData(int value);
}
如果您认为客户端需要错误信息,那么您的服务将发送类型为faultexception的所有错误情况。
您的客户端可以捕获FaultException类型,该类型表示在操作契约中指定的自定义SOAP错误。
ServiceReference1.Service1Client proxy = new ServiceReference1.Service1Client();
try
{
Console.WriteLine("Returned: {0}", proxy.GetData(-5));
}
catch (FaultException<int> faultOfInt)
{
//TODO
proxy.Abort();
}
catch (FaultException<string> faultOfString)
{
//TODO
proxy.Abort();
}
catch (FaultException<DateTime> faultOfDateTime)
{
//TODO
proxy.Abort();
}
catch (FaultException faultEx)
{
Console.WriteLine("An unknown exception was received. "
+ faultEx.Message
+ faultEx.StackTrace
);
proxy.Abort();
}
catch (Exception e)
{
//generic method
Type exceptionType = e.GetType();
if (exceptionType.IsGenericType && exceptionType.GetGenericTypeDefinition() == typeof(FaultException<>))
{
PropertyInfo prop = exceptionType.GetProperty("Detail");
object propValue = prop.GetValue(e, null);
Console.WriteLine("Detail: {0}", propValue);
}
else
{
Console.WriteLine("{0}: {1}", exceptionType, e.Message);
}
}
最后,由于FaultException继承了Exception,所以您仍然可以使用反射来获取内部故障类型和详细信息,如下所示。
还要注意WCF客户端上通信方法的常见预期异常包括TimeoutException、CommunicationException和CommunicationException的任何派生类(如FaultException)。这表明通信过程中出现了问题,可以通过终止WCF客户端并报告通信失败来安全处理。
直接用:
if (error is FaultException<ServerTooBusyException>)
{
// Do something
}