问题标签 [faultexception]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 为什么 WCF 故障异常在跨越两个边界后不保留其详细信息?
当跨边界引发错误异常时,它可以采用类型参数,以跨 WCF 边界传递详细信息对象。然而,我注意到当一个错误异常跨越两个边界时(或者因为它被重新抛出,或者因为异常只是在堆栈中冒泡),详细对象就会丢失。这是设计使然吗?如果是这样,为什么?
如果你想看看我在说什么,我有一个代码库,它显示了这一点:
.net - 捕获故障异常对于任何异常派生的 TDetail?
如何捕获任何异常派生的 TDetail 的 FaultException?
我试过catch( FaultException<Exception> ) {}
了,但这似乎不起作用。
编辑
目的是获得对 Detail 属性的访问权限。
wcf - 抛出 FaultException 时 WCF 抛出 CommunicationException
解决方案:
一些跟踪显示 CommunicationException 被抛出,因为我的异常 T 没有正确序列化存在问题;因为,在两层深处,我有一个匿名类型的对象,它是不可序列化的。删除它并冒泡更改似乎可以修复它。在那之前我还做了一些其他的小事,但我一生都记不起它是什么,只是它没有在配置中完成。
我从我的踪迹中收到消息,例如:
原帖
我今天遇到了一个看似奇怪的问题,我就是找不到答案!
问题:当我抛出一个 FaultException 时,我的服务正在抛出一个 CommunicationException!如果我不抛出异常,它就不会这样做。
在我的服务中,我正确定义了故障合同:
然后在错误条件下我抛出正确类型的异常:
然后我在客户端捕捉到它:
这对我来说似乎一切正常,并且应该可以工作。但是,一旦我去测试我的错误子句(通过提供错误的数据,例如缺少的字段),整个事情就死在我身上了。当我抛出我的 FaultException 时,服务会抛出带有消息的 CommunicationException
有人可以提供一些关于这个的见解吗?我正在使用 basicHttp 绑定,我也尝试过使用 wsHttp。我会根据要求发布我的配置文件。
c# - 客户端不会捕获泛型 FaultException<T>,只会捕获 FaultException
我已经阅读了所有要阅读的内容,但也许我错过了一些东西(好吧,我肯定错过了一些东西,否则它已经可以工作了)
我在服务器业务层中抛出了一些异常错误:
我在服务中未处理,但我有一个IErrorHandler
要捕获并创建一个FaultMessage
:
不用问;我已经用调试器确认它进入了零件if (error is RfcException)
部分,我已经逐步完成了该代码,并且它一直到最后没有任何问题。那个errorHandler包装了一条FaultException<RfcServiceFault>
消息,RfcServiceFault
消息就是这个
该服务具有应具有带有 faultContract 的 wcf 服务的所有注释:
现在:在客户端进行测试,像这样的简单测试:
我已经阅读了很多很多关于这个类似问题的帖子:
但到目前为止似乎没有任何帮助,我尝试在 web.config 中设置 WCF 跟踪:
我在那里得到一个 svclog 文件,我用 WCF Trace 查看器打开,但我只看到一堆消息,黄色的显示异常,但它只确认客户端已经看到的内容,System.ServiceModel.FaultException
正在接收,而不是通用的
任何想法如何解决这个问题?
编辑忘了提,我在配置中启用了我的错误处理程序,如下所示:
wcf - 处理 WCF 错误
我正在使用一个使用 WCF 服务的客户端。在各种情况下,服务只是引发一个带有关联消息的 FaultException,告知给定故障背后的原因。
其中一些错误是可以由我们的客户端应用程序处理的事情,但我犹豫是否简单地尝试对 FaultExceptions 消息或原因执行一些字符串匹配以确定它是否是我们可以满足的。
我希望 FaultException 上的 FaultCode 可用于识别我们可以处理的特定类型的故障,但似乎这纯粹是为了识别少数 SOAP 故障。如果我对此的解释不正确,请纠正我。
我知道可能会引发 FaultException,但我觉得期望为错误背后的每个原因创建一个新类型是不现实的。
你如何处理这种情况。作为一个人为的例子。考虑一个提供以下方法的服务;
现在在上面的示例中,如果您使用不存在的 id 调用 GetRecordById,您会收到一个 FaultException 和一条消息,指出“找不到记录”。类似地,如果您为已存在的记录调用 Add,或为不存在的记录调用 Update,您只需获取 FaultException 和 Message/Reason,详细说明失败的原因。我需要知道记录是否存在以确定我应该更新还是插入。正如我所提到的,我对简单地匹配字符串犹豫不决,因为我无法控制它们是否保持不变。
在这种情况下您会期望什么(与 FaultException 关联的类型,详细说明 RecordNotFoundException 等)或与 FaultException 关联的某个泛型类型,它定义了与错误相关的特定详细信息。例如,带有成员 Code(失败原因的常量或枚举标识符)的 RecordOperationExcpetion 类,以及用户友好的消息。
至少通过这种方式,我可以识别错误原因,而无需求助于字符串匹配。
感谢您的想法。
wcf - 无法使用 WSDualHttpBinding 在 WCF 客户端中捕获 FaultException
我有一个带有自定义 UserNamePasswordValidator 的 WCF 服务器。
在客户端,我调用了一个向代理添加了错误凭据的函数
在我可以看到的服务器调试器中,抛出了 FaultException。但是客户端永远不会收到这个异常。它最终会在客户端出现 TimeoutException。
如果我使用正确的凭据,将调用服务器端的功能并且一切都运行良好,因此 wcf 工作正常。
但是我该怎么办,FaultException 将被抛出给客户端,这样我才能意识到客户端的凭据是错误的?
更新:它有效,当我使用 WSHttpBinding 时,我能够捕获 MessageSecurityException。但是当我使用 WSDualHttpBinding 和双通道时,我遇到了超时。
wcf - 抛出故障代码(“接收器”)但以“服务器”响应
我正在抛出接收器的故障代码,但客户端正在返回“s:服务器”作为响应故障代码。我怎样才能得到“s:Receiver”的响应?
我的代码:
回复:
wcf - 如何在不关闭 WCF 连接的情况下很好地返回 DTO
我在 C# 中的 WCF 服务看起来像这样。
从该方法返回的 DTO 如下所示:
我发现的典型示例显示从方法中抛出一个 FaultException;但就我而言,我的方法没有错误;错误发生在对象被返回给客户/消费者的时候;即当DataMember/Property XmlRep 被序列化时;
所以我不能将 throw FaultException 放在我的方法中;但我仍然想避免得到“底层连接已关闭:连接意外关闭。” 并抛出在 getter 中发生的正确错误。
我没有尝试将 try/catch 放在 MyDTO 的 getter 中,我也不想因为我希望我的 DTO 尽可能简单,并且对 FaultExceptions 和 WCF 的东西一无所知。还有其他想法吗?
编辑:为了更清楚,我知道错误发生在 MyDto DataContract 的 Getter 中;但是我还能在哪里抛出 FaultException,因为在我看来,在 Getter 内部是一个不可靠的地方来抛出它?
编辑#2:我在服务端实现了一个包罗万象的错误处理程序,正如 Tim 下面所建议的那样(使用 IErrorHandler);这在我的具体情况下不起作用。我认为这是因为错误不会发生在 OperationContract ReturnMyDTOMethod() 中,而是在被序列化时发生在 MyDto 中;换句话说,看起来马已经跑了(方法成功返回),并且 IErrorHandler 有任何用处都为时已晚 - 具体来说,ProvideFault() 不会触发,但 HandleError() 会触发。因此,我仍然收到一条频道中断消息,这需要我回到绘图板 - 即确保 MyDto 不会做任何花哨的事情,例如产生错误!
wcf - WCF - 在 IIS 中运行但通过工厂运行的 Web 服务无法保持引发的原始异常
在 IIS 中运行但通过工厂运行的 Web 服务无法跟上引发的原始异常。
例如:
我的 Web 服务已用 FaultContractAttribute 标记,如下所示:
我的 Web 服务实现抛出了一个自定义异常,如下所示:
然后:
如果我的 WCF - 不使用任何工厂 - 类似于
<%@ ServiceHost Language="C#" Debug="true" Service="MyService" %>
,那么在客户端我可以获取原始异常 (MyCustomException)<%@ ServiceHost Language="C#" Debug="true" Service="MyService" Factory="MyFactory" %>
如果我的 WCF - USING some factory - 类似于
笔记:
WCF 工厂 MyFactory 是通过其 SERVICE HOST 实现的,其中包含从 IErrorHandler 启动的 SERVICE BEHAVIOR
在这种服务行为中,ProvideFault 方法什么都不做(我不知道如何通过这种方式保持原始异常)
总之,我希望得到期望的答案:如何在使用某些 WCF 工厂时保持原始异常(MyCustomException)?谢谢。
wcf - 使用自定义异常处理程序 EL WCF 引发 FaultException
所以我试图在我的 WCF 服务中使用企业库来为我做一些与异常相关的工作。
我的想法是为说“NullReferenceException”设置一个“自定义异常处理程序”,并在“自定义异常处理程序”中创建 FaultException 异常。
我的理解是,这个“新”异常将通过网络实现,我将在客户端捕获它。
一些代码可以更好地理解:
WCF 服务:
自定义异常处理程序:(企业库)
将 NullReferenceException 映射到“自定义异常处理程序”的应用程序配置文件:
最后是期望捕获此 FaultException 的客户端代码:
但相反,我得到一个 ProtocolException,说明需要回复操作:
收到操作“方法”的回复消息,操作为“”。但是,您的客户端代码需要操作“http://tempuri.org/MyService/MethodResponse”。
我究竟做错了什么?是否可以在“自定义异常处理程序”中返回(不显式抛出)带有自定义 FaultContract 的 FaultException?
任何建议表示赞赏。
更新: 如您所见,“自定义异常处理程序”中的后处理操作设置为“ThrowNewException”。如果我将其更改为“NotifyRethrow”,我将不再使用“ProtocolException”!相反,客户端会捕获常规的“FaultException”(不是自定义类型的)。
现在的问题是为什么原始的自定义类型的 FaultException 不能跨越网络。
更新 2 我忘记提及的一件事是我的 WCF 服务在 ServiceHost 中运行,而不是在 IIS 下运行。所以基本上我有一个 Windows 服务,它创建一个 ServiceHost 并通过这个 ServiceHost 公开 Service1 接口。
我认为这可能与此问题有关的原因是 Enterprise Library 声称它处理整个应用程序中的异常,而不仅仅是在服务边界内。也许这会导致异常被抛出为时已晚?还是不在正确的水平?
更新 3
感谢您的帖子!你是对的,我搞乱自定义处理程序的唯一原因是因为我想设置 MyFaultCode 值。我尝试了您的建议 - 配置了 2 个处理程序。
首先是一个自定义处理程序并捕获 NullReference 异常。它会引发一个新异常 - MyApplicationException,带有 MyFaultContract 字段。
然后我配置了第二个处理程序 - 内置的“Fault Contract Exception Handler”,它捕获 MyApplicationException,创建新的 FaultException 并自动将 MyFaultcontract 从 MyApplicationException 映射到新创建的 FaultException。
WCF 客户端仍然捕获通用的 FaultException,而不是自定义合同。