我想将自定义异常(例如某些错误消息)作为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服务抛出的异常错误相同的错误消息
请建议
答案 0 :(得分:70)
在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”黑客只是简单地定义服务器在其FaultExceptions中返回异常细节:
<serviceBehaviors>
<behavior name="EmployeeManager_Behavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
然后你可以检查FaultException的.Detail
以查找服务器上发生的实际异常 - 但是再次:这更像是一个开发时间而不是真正的解决方案。
马克
答案 1 :(得分:2)
要实现这一点,您需要做两件事: