客户端的 WCF Web 服务自定义异常错误
Posted
技术标签:
【中文标题】客户端的 WCF Web 服务自定义异常错误【英文标题】:WCF Web Service Custom Exception Error to Client 【发布时间】:2010-11-25 02:06:46 【问题描述】:我想抛出自定义异常,例如一些错误消息作为 WCF Web 服务的异常,并尝试在调用 Web 服务方法时在客户端应用程序中接收此异常错误消息。
如何从 WCF Web 服务抛出自定义异常并在客户端接收相同的异常错误。
WCF Web 服务方法:
public bool Read()
if (IsUserValid() == false)
throw new Exception("Authorized user");
在客户端
try
_client.Read();
catch (Exception e)
MessageBox.Show(e.Message);
return;
结果:始终将错误消息作为异常抛出**即
"System.ServiceModel.FaultException: 服务器无法处理 由于内部错误而请求。为了 有关错误的更多信息, 要么打开 IncludeExceptionDetailInFaults(要么 来自 ServiceBehaviorAttribute 或来自 配置 行为)在服务器上,以便 将异常信息发回给 客户端,或根据 Microsoft .NET Framework 3.0 SDK 文档并检查服务器 跟踪日志。”
这是代码抛出异常,但没有返回与从 WCF Web 服务抛出的相同错误消息作为异常错误
请推荐
【问题讨论】:
您可以在类似问题中找到答案:***.com/questions/5165004/… 【参考方案1】:在 WCF 中,您不应该抛出标准 .NET 异常 - 这与 WCF 潜在的互操作性质相反 - 毕竟,您的客户端可能是没有 .NET 异常概念的 Java 或 php 客户端。
相反,您需要抛出 FaultExceptions(这是 WCF 的标准行为)。
如果您想传达有关问题所在的更多信息,请查看通用 FaultException<T>
类型:
服务器:
public bool Read()
if (IsUserValid() == false)
throw new FaultException<InvalidUserFault>("User invalid");
或者(如@MortenNorgaard 建议的那样):
public bool Read()
if (!IsUserValid())
InvalidUserFault fault = new InvalidUserFault();
FaultReason faultReason = new FaultReason("Invalid user");
throw new FaultException<InvalidUserFault>(fault, faultReason);
客户:
try
_client.Read();
catch (FaultException<InvalidUserFault> e)
MessageBox.Show(e.Message);
return;
您应该将您的 InvalidUserFault
声明为 WCF 数据协定,并定义哪些成员可以使用该类型返回(即错误代码、错误消息等)。
[DataContract]
[Serializable()]
public class BusinessFault
... add your fault members here
然后你应该用它可能引发的错误来装饰你的服务方法:
[FaultContract(typeof(InvalidUserFault)]
[OperationContract]
public bool Read()
.....
当然,“quick'n'dirty” hack 只是简单地定义服务器在其 FaultExceptions 中返回异常详细信息:
<serviceBehaviors>
<behavior name="EmployeeManager_Behavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
然后您可以检查 FaultException 的 .Detail
以了解服务器上发生的实际异常 - 但同样:这更像是仅在开发时进行的黑客攻击,而不是真正的解决方案。
马克
【讨论】:
这个throw new FaultException<InvalidUserFault>("User invalid");
无效,你需要在ctor中传入一个实际的InvalidUserFault
。
我建议如下,因为故障原因似乎是 SOAP 规范所要求的(参考。***.com/questions/9614992/…) public bool Read() if (IsUserValid() == false) InvalidUserFault fault = 新的无效用户故障(); FaultReason faultReason = new FaultReason("无效用户"); throw new FaultException要让它发挥作用,您需要做两件事:
在接口中定义故障契约(WCF 契约) 将异常作为故障异常抛出【讨论】:
以上是关于客户端的 WCF Web 服务自定义异常错误的主要内容,如果未能解决你的问题,请参考以下文章
在 WCF/WIF 中,如何合并来自两个不同客户端的自定义 sts 令牌的声明
在WCF中,自定义Authentication,Validate方法,抛出错误异常时如何在不停止服务的情况下处理异常?
从服务器抛出的自定义错误未在客户端的 HttpErrorResponse 中返回