我正在尝试在WCF服务中实现FaultException。我提到了各种文章。但是,似乎永远不会在客户端捕获FaultExceptions。 我写了这样的代码,
服务合同 -
[ServiceContract]
public interface IService2
{
[OperationContract]
[FaultContract(typeof(MyException))]
[DebuggerStepThrough]
MyException GetData(int value);
}
[DataContract]
public class MyException
{
[DataMember]
public bool Result { get; set; }
[DataMember]
public string ErrorMessage { get; set; }
[DataMember]
public Exception MyInnerException { get; set; }
[DataMember]
public string ClientMessage { get; set; }
}
服务实施 -
public class Service1 : IService2
{
public MyException GetData(int value)
{
MyException mx = new MyException();
try
{
double a = 44;
if (value == 0)
{
throw new DivideByZeroException();
}
double res = a / value;
mx.ClientMessage = "Everything is well";
mx.Result = true;
return mx;
}
catch (DivideByZeroException dvex)
{
mx.Result = true;
mx.ClientMessage = "Divide by zero";
mx.MyInnerException = dvex;
mx.ErrorMessage = dvex.StackTrace;
throw new FaultException<MyException>(mx, dvex.ToString());
}
}
}
客户端(aspx.cs页面) -
try
{
FaultContractsDemo.ServiceReference1.Service2Client o = new ServiceReference1.Service2Client();
MyException data = o.GetData(0);
if (data.Result)
lblMessage.Text = "All is well";
}
catch (FaultException<MyException> ex)
{
lblMessage.Text = ex.Detail.ClientMessage;
}
服务层抛出异常,但客户端永远不会收到任何异常。我得到了未处理的异常,例如,
基础连接已关闭:连接已关闭 出乎意料。
答案 0 :(得分:0)
我可以重现这个问题(在一个不同但非常相似的情况下)。问题是由这种组合引起的:
// Fault class:
[DataMember]
public Exception MyInnerException { get; set; }
// Just before throwing the FaultException
mx.MyInnerException = dvex; // <-- DivideByZeroException
WCF不喜欢序列化DivideByZeroException,这是通过网络获取它所必需的。注释掉那条线和东西可能会开始起作用。
要添加到此,通常您不会希望传递内部异常(至少:不是这样),因为这将被视为安全风险。但有一个例外:这是你正在调试的时候。在这种情况下,请参阅IncludeExceptionDetailInFaults上的文章:这允许您在客户端查看异常详细信息。