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类型的错误传递给客户端吗?非常感谢。

WCF FaultException<SqlException> caught as Communicati

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]类型。只有基元类型的字段(stringint等)才能正确传输。这对于一个非常简单的异常类型来说是可以的,但对于像SqlException这样的复杂类型来说,这还不够好。

我建议的解决方案是:创建自己的专用数据契约,将所需的SqlException中的数据传递回来,然后抛出。事实上,对所有异常类型都这样做,这样做更安全,实践效果更好。我使用企业库异常屏蔽来自动处理此问题。所有传递回客户端的都是标识服务器日志中错误数据的单个GUID值。

或者,如果您决定走异常路线,请参阅这篇详细的文章。

我遇到这个问题是因为我在错误的地方有一个断点。我用Debug..Delete all BreakpointsCtrl-Alt-F9)删除了所有断点,所有CommunicationException异常都消失了,取而代之的是返回的正确消息。

是的,超时是60秒,所以这根本不应该发生,所以这可能是Visual Studio 2012的一些奇怪的工件。