C# 为什么WCF服务可以';是否在没有故障异常的情况下向客户端发送准确的异常?

C# 为什么WCF服务可以';是否在没有故障异常的情况下向客户端发送准确的异常?,c#,wcf,C#,Wcf,请让我知道为什么我们不能在wcf服务中获得确切的异常,而不使用faultexception或FaultContract 我搜索了很多网站,但没有得到正确的答案 这个问题在我的采访中被问到了 谢谢在您的app.config文件中,您可以通过以下方式激活serviceDebug: <serviceBehaviors> <behavior name=""> <serviceDebug includeExceptionDetailInFa

请让我知道为什么我们不能在wcf服务中获得确切的异常,而不使用faultexception或FaultContract

我搜索了很多网站,但没有得到正确的答案

这个问题在我的采访中被问到了


谢谢

在您的
app.config
文件中,您可以通过以下方式激活
serviceDebug

<serviceBehaviors>
        <behavior name="">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
 </serviceBehaviors>

在您的
app.config
文件中,您可以通过以下方式激活
serviceDebug

<serviceBehaviors>
        <behavior name="">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
 </serviceBehaviors>

我们使用WCF的主要原因之一是互操作性。可互操作的应用程序可以与构建在任何其他平台(比如Java)上的任何应用程序进行通信

.Net异常特定于.Net。它们只能被同样是.Net的客户端理解。Net异常永远无法被其他平台理解。如果希望WCF服务是可互操作的,那么该服务应该抛出故障异常

例如,Java平台中没有类似于ChannelTerminatedException的异常。如果将此异常抛出到基于Java构建的客户机,则该客户机将永远无法理解此异常

故障异常允许您创建强类型SOAP故障。通过故障生成的SOAP消息不是特定于.Net的,因此任何平台都可以理解


在基于SOAP的SOA实现中,错误消息是共享任何错误信息的标准。有关标准和SOAP故障消息结构的更多信息,请遵循:和

我们使用WCF的主要原因之一是互操作性。可互操作的应用程序可以与构建在任何其他平台(比如Java)上的任何应用程序进行通信

.Net异常特定于.Net。它们只能被同样是.Net的客户端理解。Net异常永远无法被其他平台理解。如果希望WCF服务是可互操作的,那么该服务应该抛出故障异常

例如,Java平台中没有类似于ChannelTerminatedException的异常。如果将此异常抛出到基于Java构建的客户机,则该客户机将永远无法理解此异常

故障异常允许您创建强类型SOAP故障。通过故障生成的SOAP消息不是特定于.Net的,因此任何平台都可以理解


在基于SOAP的SOA实现中,错误消息是共享任何错误信息的标准。有关标准和SOAP故障消息结构的更多信息,请遵循:和

通过设置
,可以获得准确的错误消息。但通常情况下,客户机对此毫无办法,客户机可能也不基于.Net。在这些情况下,发送.Net异常是无效的
FaultContract
s用一些有意义的消息通知客户到底出了什么问题。是的,我可以做些什么来获得准确的消息,但我的问题是,为什么我们不能像简单的windows应用程序那样使用FaultContract来获得准确的错误消息,我们已经尝试捕获并将获得准确的错误消息,如果没有faultcontract,您就无法对该错误消息进行序列化,这是一种序列化吗?
faultcontract
用于隐藏实际的错误消息。但请提供一些相关信息。假设由于某种原因操作失败。堆栈跟踪/异常对象可能包含敏感信息,如凭据/信用卡号或发生这些故障的某些信息。让这些信息通过网络传播或可能到达客户端不是一个好主意。如果隐藏这些详细信息并让客户端知道操作失败,请提供上下文。异常总是可序列化的。感谢Amit,这对我来说有一定的意义:)我可以考虑两个原因:1)expeption对象(如ArgumentException)不能序列化,也可以不可序列化,或者不能作为合同的一部分2)原始异常可能会暴露敏感数据,如数据库名称,因此,建议您先处理消息内容,正确的方法是抛出一个新的FaultException。您可以通过设置
来获得准确的错误消息。但通常情况下,客户机对此毫无办法,客户机可能也不基于.Net。在这些情况下,发送.Net异常是无效的
FaultContract
s用一些有意义的消息通知客户到底出了什么问题。是的,我可以做些什么来获得准确的消息,但我的问题是,为什么我们不能像简单的windows应用程序那样使用FaultContract来获得准确的错误消息,我们已经尝试捕获并将获得准确的错误消息,如果没有faultcontract,您就无法对该错误消息进行序列化,这是一种序列化吗?
faultcontract
用于隐藏实际的错误消息。但请提供一些相关信息。假设由于某种原因操作失败。堆栈跟踪/异常对象可能包含敏感信息,如凭据/信用卡号或发生这些故障的某些信息。让这些信息通过网络传播或可能到达客户端不是一个好主意。如果隐藏这些详细信息并让客户端知道操作失败,请提供上下文。异常总是可序列化的。感谢Amit,这对我来说有一定的意义:)我可以考虑两个原因:1)expeption对象(如ArgumentException)不能序列化,也可以不可序列化,或者不能作为合同的一部分2)原始异常可能会暴露敏感数据,如数据库名称,因此,建议您先处理消息内容,正确的方法是抛出一个新的FaultException,我可以这样做,以获得确切的消息,我已经知道无论如何,谢谢