我有这个简单的测试项目只是为了测试IncludeExceptionDetailInFaults行为。
public class Service1 : IService1
{
public string GetData(int value)
{
throw new InvalidCastException("test");
return string.Format("You entered: {0}", value);
}
}
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
}
在服务的app.config中,我将其设置为true
<serviceDebug includeExceptionDetailInFaults="True" />
在客户端:
try
{
using (var proxy = new ServiceReference1.Service1Client())
Console.WriteLine(proxy.GetData(5));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
这就是我认为的行为: 设置为includeExceptionDetailInFaults = true会将异常详细信息传播到客户端。但我总是得到CommunicationObjectFaultException。
我确实尝试在合同上使用FaultContract(typeof(InvalidCastException))但行为相同,只是获取了CommunicationObjectFaultException。
使其工作的唯一方法是抛出新的FaultException(new InvalidCastException(“test”));
但是我想IncludeExceptionDetailInFaults = true,上面是自动完成的。
我错过了什么吗?
答案 0 :(得分:8)
这是因为您已将服务客户端放在using
块中。
WCF客户端是.NET中shouldn't use using
的一个位置,因为它会掩盖“真正的”异常。
技术说明:Dispose
调用Close
,如果频道已经出现故障(即由于之前的异常),它将始终抛出CommunicationObjectFaultedException
,随后放入堆栈顶部的异常。在清理ICommunicationObject
时,为了避免屏蔽异常,您必须先检查State
以查看是否出现故障,如果是,请调用Abort
而不是{{1} }}