WCF FaultException<SqlException> caught as Communicati
本文关键字:caught as Communicati gt SqlException lt WCF FaultException | 更新日期: 2023-09-27 18:26:55
我有一个WCF服务,我在其中捕获SqlException,然后将其作为FaultException返回,如以下
throw new FaultException<SqlException>(...);
在客户端,我像这个一样捕捉到它
catch (FaultException<SqlException> e)
{
// do something with exception
}
catch (FaultException<Exception> e)
{
// do something with exception
}
我认为我在服务端的web.config或客户端(winform客户端)的app.config中没有问题,因为我可以捕获FaultException<ArgumentException>
、FaultException<Exception>
等,但不能捕获FaultException<SqlException>
我没有发现任何迹象表明我无法将SqlExceptions传递给客户端,我的操作合约已正确配置了[FaultContract(typeof(SqlException))]
和[FaultContract(typeof(Exception))]
有人看到过这一点,或者知道我不能(或者可能需要做一些特殊的事情)将SqlException类型的错误传递给客户端吗?非常感谢。
throw new FaultException<Exception>
并不是WCF故障系统的真正用途。指定的类型在SOAP错误的<Detail>
元素中跨线序列化。通常,这种类型是您编写的WCF数据协定类,例如
[DataContract]
public class MyFault {
[DataMember]
public string Message {get; set;}
}
throw new FaultException<Exception>
恰好工作,因为Exception
是[Serializable]
,而DataContractSerializer
能够处理[Serializable]
类型和[DataContract]
类型。
然而,这种方法存在严重的局限性。DataContractSerializer
不能很好地处理[Serializable]
类型。只有基元类型的字段(string
、int
等)才能正确传输。这对于一个非常简单的异常类型来说是可以的,但对于像SqlException
这样的复杂类型来说,这还不够好。
我建议的解决方案是:创建自己的专用数据契约,将所需的SqlException
中的数据传递回来,然后抛出。事实上,对所有异常类型都这样做,这样做更安全,实践效果更好。我使用企业库异常屏蔽来自动处理此问题。所有传递回客户端的都是标识服务器日志中错误数据的单个GUID值。
或者,如果您决定走异常路线,请参阅这篇详细的文章。
我遇到这个问题是因为我在错误的地方有一个断点。我用Debug..Delete all Breakpoints
(Ctrl-Alt-F9
)删除了所有断点,所有CommunicationException异常都消失了,取而代之的是返回的正确消息。
是的,超时是60秒,所以这根本不应该发生,所以这可能是Visual Studio 2012的一些奇怪的工件。