我们已经为服务提供了REST和SOAP端点,因此我们使用WebFaultException传递友好的消息。这对于REST调用非常有效,而对于SOAP调用则没有太大作用。以下是在“detail”元素中清楚显示友好消息的跟踪。但是,在客户端上引发的FaultException在消息中具有http状态代码描述-而不是从服务中抛出的真实消息。有什么方法可以在客户端上显示预期的消息吗?
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header></s:Header>
<s:Body>
<s:Fault>
<faultcode xmlns:a="http://schemas.microsoft.com/2009/WebFault" xmlns="">a:BadRequest</faultcode>
<faultstring xml:lang="en-US" xmlns="">Bad Request</faultstring>
<detail xmlns="">
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Country code must be 3 characters.</string>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>
此外,这是在.net 4.0中,并且我们使用的是CaSTLe的WCF工具(DefaultServiceModel和RestServiceModel)。
最佳答案
由于安全原因,WCF在默认情况下和设计上将不报告详细的错误信息。它基本上只会告诉您“服务器上出了点问题-运气不好”。
您可以-为了进行开发和测试-启用更详细的错误信息,但应将其关闭以进行生产。
为此,请在服务器上使用服务行为:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="DetailedDebugging">
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="YourService"
behaviorConfiguration="DetailedDebugging" >
....
</service>
</services>
</system.serviceModel>
现在,您的服务应该向后报告详细的SOAP错误,包括所有详细信息,一直返回到客户端应用程序。
更新:,如果我没记错的话,在处理标准(非类型化)
FaultException
时,您可以轻松访问FaultCode
和FaultReason
等内容,但是获取消息的细节有点麻烦-尝试这样:try
{
// your service call here
}
catch(FaultException fe)
{
FaultCode fc = fe.Code;
FaultReason fr = fe.Reason;
MessageFault mf = fe.CreateMessageFault();
if(mf.HasDetail)
{
string detailedMessage = mf.GetDetail<string>();
}
}
这是否使您可以访问有关SOAP故障的详细描述?
关于WCF故障异常不会在客户端上显示 SOAP 服务的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5119464/