gpt4 book ai didi

c# - WCF FaultException 作为 CommunicationException 捕获

转载 作者:行者123 更新时间:2023-11-30 21:08:36 26 4
gpt4 key购买 nike

我有一个 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 错误系统的真正用途。您指定的类型在 <Detail> 中通过网络进行序列化。 SOAP 错误的元素。通常,此类型是您编写的 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 的数据你需要的,然后把它扔掉。事实上,对所有异常类型都这样做,它更安全,也是更好的做法。我用 Enterprise Library Exception Shielding自动处理这个。返回给客户端的只是一个单一的 GUID 值,用于标识服务器日志中的错误数据。

或者,如果您决定走异常(exception)路线,请参阅 this detailed article .

关于c# - WCF FaultException<SqlException> 作为 CommunicationException 捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9574823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com