- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
单层应用程序可以通过以下方式区分异常:
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,因为它是处理错误的 native Soap 方法(异常也不可序列化)。
在典型的场景中,您将首先在每个操作合约上添加类型化的 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);
}
您的服务将为您决定客户端需要故障信息的所有故障情况发送类型化故障异常。
您的客户端可以捕获表示操作契约中指定的自定义 SOAP 错误的 FaultException 类型。
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 客户端并报告通信失败来安全地处理该问题。
关于c# - 捕获特定的 WCF FaultException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16045726/
我已经阅读了关于此的所有内容,但也许我遗漏了一些东西(好吧,我肯定遗漏了一些东西,否则它已经可以工作了) 我在我的服务器业务层中抛出了一些异常错误: public class RfcException
好的,我知道我在这里遗漏了一些东西。我有以下操作合约: public double DivideByZero(int x, int y) { if (y =
什么更有效?抛出异常或抛出错误……我认为有两种情况: 发生异常并被捕获,是否抛出现有的 Exception或新建 FaultException然后扔那个? 您自己的逻辑(例如用户名不能为空)需要将错误
我有一个 WCF 服务,如果出现问题,它会抛出一个通用的 FaultException。 我不知道为什么,有时客户端会捕获非泛型 FaultException 而不是泛型异常。 有谁知道,问题是什么?
我们目前有一种在测试页面中调用网络服务的机制。但是,我正在尝试查看 WCF 服务的更好做法并使用 FaultException。 所以有我们服务抛出FaultException的情况,我想将该故障序列
我发布了一个question关于使用消息与故障异常在服务之间传达业务规则。 我的印象是通过网络抛出这个异常会带来开销,但考虑到它只是一条被序列化和反序列化的消息,它们实际上是一样的。 但这让我开始考虑
我有一个关于如何将自定义异常作为FaultException 发送的问题。当我使用像 ArgumentException 这样的系统异常时它可以工作,但是如果我将其更改为自定义异常“TestExcep
我有一个非常简单的 3 层项目。有一个与数据存储交互的 DAL(数据访问层)WCF 服务; BLL(业务逻辑层)WCF 服务作为 DAL 服务和客户端 UI 以及 Windows 窗体客户端层之间的中
我正在尝试在 WCF 服务中实现异常处理。我希望将此异常抛出给客户端,以便记录和处理它。 我不知道我写的代码是对还是错。这只会让我“faultexception 未被用户代码处理”我应该如何解决才能处
对于以下异常,没有在异常窗口中指定原因(->查看详细信息): System.ServiceModel.FaultException The creator of this fault did not
在我的 WCF 服务上,我有几个自定义故障类型。一个名为 BaseFault 的抽象类型及其两个实现,分别称为 TypeOneFault 和 TypeTwoFault 我是这样在服务端抛出异常的 pu
单层应用程序可以通过以下方式区分异常: Exception ex; if (ex is System.DirectoryServices.AccountManagement.PasswordExcep
我正在使用 C# 从 .NET 4.5 调用 SOAP Web 服务,但我不明白如何捕捉未类型化 FaultException 的详细信息. 如果 Web 服务遇到错误,我会收到如下消息:
我在调用服务 API 时捕获了 FaultException,例如 catch(FaultException e) { // How do I get the MyCustomEx objec
我有一些预定义的 WCF 服务 FaultContract属性。当FaultException抛出异常,它们会发送 StackTrace、Source 和其他可能未保存的信息。 是否可以只返回: 详细
我为每个帖子都提供了一个pingback列表。看起来像这样: def send_trackback #do stuff begin Pingback::Client.new.ping(
我正在了解 WCF 服务上下文中的 FaultException 和 CLR 异常,但有些内容尚不清楚。在“Learning WCF”一书中,它说当服务抛出一个正常的 CLR 异常时,它会被服务模型捕
在更新我的 WCF 客户端的服务引用时(只需在 Visual Studio 2008 中单击“更新服务引用”),出现以下错误:System.ServiceModel.FaultException: T
我正在尝试在带有 .net 4.5 的 VS 2012 中使用带有 Telerik OpenAccess 的 WCF Plain 服务。 我尝试了 telerik 开发人员手册并创建了服务和客户端。
我只是在检查 WCF FaultContract。根据它的定义,它用于向客户端发送异常详细信息。但是我们可以只使用 FaultException 来做到这一点。那么为什么我们需要 FaultContr
我是一名优秀的程序员,十分优秀!