我想抛出自定义异常,如一些错误消息作为WCF Web服务的异常,并在客户端应用程序中尝试接收此异常错误消息调用Web服务方法.
如何从WCF Web服务抛出自定义异常并在客户端收到相同的异常错误.
WCF Web服务方法:
public bool Read()
{
if (IsUserValid() == false)
{
throw new Exception("Authorized user");
}
}
Run Code Online (Sandbox Code Playgroud)
在客户端
try
{
_client.Read();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return;
}
Run Code Online (Sandbox Code Playgroud)
结果:始终将错误消息作为例外**即
"System.ServiceModel.FaultException:由于内部错误,服务器无法处理请求.有关错误的更多信息,请在服务器上启用IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute或配置行为)以发送异常信息返回到客户端,或根据Microsoft .NET Framework 3.0 SDK文档打开跟踪并检查服务器跟踪日志."
这是代码抛出异常但不返回与从WCF Web服务抛出的异常错误相同的错误消息
请建议
mar*_*c_s 70
在WCF中,您不应该抛出标准的.NET异常 - 这与WCF的潜在可互操作性质相反 - 毕竟,您的客户端可能是没有.NET异常概念的Java或PHP客户端.
相反,您需要抛出FaultExceptions(这是WCF的标准行为).
如果您想传达有关出错的更多信息,请查看泛型FaultException<T>类型:
服务器:
public bool Read()
{
if (IsUserValid() == false)
{
throw new FaultException<InvalidUserFault>("User invalid");
}
}
Run Code Online (Sandbox Code Playgroud)
或者(由@MortenNorgaard建议):
public bool Read()
{
if (!IsUserValid())
{
InvalidUserFault fault = new InvalidUserFault();
FaultReason faultReason = new FaultReason("Invalid user");
throw new FaultException<InvalidUserFault>(fault, faultReason);
}
}
Run Code Online (Sandbox Code Playgroud)
客户:
try
{
_client.Read();
}
catch (FaultException<InvalidUserFault> e)
{
MessageBox.Show(e.Message);
return;
}
Run Code Online (Sandbox Code Playgroud)
您应该声明您的InvalidUserFaultWCF数据合同,并定义哪些成员可以使用该类型返回(即错误代码,错误消息等).
[DataContract]
[Serializable()]
public class BusinessFault
{
... add your fault members here
}
Run Code Online (Sandbox Code Playgroud)
然后你应该用你可能抛出的错误来装饰你的服务方法:
[FaultContract(typeof(InvalidUserFault)]
[OperationContract]
public bool Read()
.....
Run Code Online (Sandbox Code Playgroud)
当然,"quick'n'dirty"hack只是简单地定义服务器在其FaultExceptions中返回异常细节:
<serviceBehaviors>
<behavior name="EmployeeManager_Behavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
Run Code Online (Sandbox Code Playgroud)
然后你可以检查FaultException .Detail以查找服务器上发生的实际异常 - 但同样:这更像是一个开发时间而不是真正的解决方案.
渣