问题标签 [ierrorhandler]
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 IErrorHandler 更改 StackTrace
我在 WCF 服务器中添加了 IErrorHandler 实现。
当调试器点击此方法时:
看来我失去了所有的堆栈跟踪。
我想查看 System.Diagnostics.Stacktrace 中的堆栈跟踪(快速查看),并了解哪个 WCF 方法是当前错误/异常处理的入口点。
取而代之的是,我得到了这个堆栈:
WebApi.DLL!WebApi.ErrorHandler.ProvideFault(System.Exception 错误,System.ServiceModel.Channels.MessageVersion 版本,参考 System.ServiceModel.Channels.Message 故障)第 29 行 C# System.ServiceModel.dll!System.ServiceModel.Dispatcher.ErrorBehavior .ProvideFault(System.Exception e, System.ServiceModel.Channels.FaultConverter faultConverter, ref System.ServiceModel.Dispatcher.ErrorHandlerFaultInfo faultInfo) + 0x8e 字节
System.ServiceModel.dll!System.ServiceModel.Dispatcher.ErrorBehavior.ProvideMessageFaultCore(ref System.ServiceModel .Dispatcher.MessageRpc rpc) + 0x118 字节
System.ServiceModel.dll!System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage8(ref System.ServiceModel.Dispatcher.MessageRpc rpc) + 0xab 字节 System.ServiceModel.dll!System.ServiceModel.Dispatcher.MessageRpc.ProcessError(System.Exception e) + 0x3c3 字节
System.ServiceModel.dll!System.ServiceModel.Dispatcher.MessageRpc.Process(bool isOperationContextSet) + 0x21e 字节 System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(System.ServiceModel.Channels.RequestContext request, bool cleanThread, System.ServiceModel.OperationContext currentOperationContext) + 0x664 字节 System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(System.ServiceModel.Channels.RequestContext request, System.ServiceModel.OperationContext currentOperationContext) + 0x1e3 字节
System.ServiceModel.dll!System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(System.IAsyncResult 结果) + 0x4b 字节 System.Runtime.DurableInstancing.dll!System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(System.IAsyncResult 结果) + 0x32 字节
System.Runtime.DurableInstancing.dll!System.Runtime.AsyncResult.Complete(bool completedSynchronously) + 0x16b 字节 System.Runtime.DurableInstancing.dll!System.Runtime.InputQueue.AsyncQueueReader.Set(System.Runtime.InputQueue.Item 项) + 0x41 字节 System.Runtime.DurableInstancing.dll!System.Runtime.InputQueue.EnqueueAndDispatch(System.Runtime.InputQueue.Item 项,布尔 canDispatchOnThisThread) + 0x3d7 字节
System.Runtime.DurableInstancing.dll!System.Runtime.InputQueue.EnqueueAndDispatch(System.ServiceModel.Channels.RequestContext item, System.Action dequeuedCallback, bool canDispatchOnThisThread) + 0x7e 字节 System.ServiceModel.dll!System.ServiceModel.Channels.SingletonChannelAcceptor。 Enqueue(System.ServiceModel.Channels.RequestContext 项, System.Action dequeuedCallback, bool canDispatchOnThisThread) + 0x66 字节
System.ServiceModel.dll!System.ServiceModel.Channels.HttpChannelListener.HttpContextReceived(System.ServiceModel.Channels.HttpRequestContext 上下文, System.Action回调) + 0x22e 字节 System.ServiceModel.Activation.dll!System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived(System.ServiceModel.Activation.HostedHttpRequestAsyncResult 结果) + 0x12d 字节
System.ServiceModel.Activation.dll!System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest() + 0x24e 字节
System.ServiceModel.Activation.dll!System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest() + 0x55 字节
System.ServiceModel.Activation。 dll!System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest(object state) + 0x53 bytes
System.Runtime.DurableInstancing.dll!System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* nativeOverlapped) + 0x71 字节
System.Runtime.DurableInstancing.dll!System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(uint error, uint bytesRead, System.Threading.NativeOverlapped* nativeOverlapped) + 0x40 字节
mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x96 字节
[本地到托管转换]
[Appdomain 转换]
[本地到托管转换]
c# - 使用 IErrorHandler 处理 WCF 异常
我基本上是在实现IErrorHandler
接口,从 WCF 服务中捕获各种异常,并通过实现ProvideFault
方法将其发送给客户端。
然而,我正面临一个关键问题。所有异常都作为 a 发送给客户端,FaultException
但这使客户端无法处理他可能在服务中定义的特定异常。
考虑:SomeException
已经在其中一个OperationContract
实现中定义和抛出。抛出异常时,使用以下代码将其转换为错误:
这确实将错误作为字符串发送,但客户端必须捕获一般异常,例如:
并不是:
不仅像 SomeException 这样的自定义异常,而且像 InvalidOperationException 这样的系统异常都无法使用上述过程捕获。
关于如何实现这种行为的任何想法?
wcf - 将依赖项注入 IErrorHandler 实现
我正在实施IErrorHandler
以便将我的 WCF 服务的所有错误处理集中在一个地方。这工作得很好:
现在,我们使用 Ninject 在服务的其余部分注入依赖项,我也想在这里做同样的事情。由于 WCF 正在根据我的配置构造对象,而且我认为我没有任何挂钩到这个过程中,我需要使用属性注入:
然而,这似乎永远不会被注入。我尝试使用 Ninject 的 MVC 扩展来设置ServiceErrorHandler
允许像过滤器一样的注入,但这似乎没有奏效。有没有办法做到这一点?
wcf - IErrorHandler - 在 ProvideFault 和 HandleError 之间共享错误代码
我已经在我的 WCF 服务中实现了 IErrorHandler 以确定应该发送给客户端的内容 (ProvideFault) 并记录异常 (HandleError)。
作为这个过程的一部分,我想:
- 向客户端发送带有一些标准文本的错误代码以隐藏内部异常详细信息。
- 使用相同的错误代码记录错误,以便我可以将日志文件中的条目与来自客户端的错误报告相匹配。
我一直在研究这一点,但找不到一种方法可以保证在两种方法中使用相同的错误代码,因为 HandleError 将在未来某个时间在单独的线程上调用。这似乎排除了使用某种类级别的计数器,因为在调用 HandleError 之前可以调用两次 ProvideFault。
有没有人遇到过同样的情况并制定了在这种情况下使用的解决方案/模式?
wcf - Castle Windsor - 将记录器注入 IErrorHandler
我在我的 Wcf 服务项目中使用 Castle windsor 3.0。我使用 Topshelf 将其托管为 Windows 服务项目。我所有的 wcf 服务配置都在 app.config 文件中。我正在使用城堡 wcffacility 并注册这样的服务 -
这会将 ILog(来自 log4net)注入我的服务而没有任何问题,但它无法注入 IErrorHandler。
我添加了带有 IErrorHandler 的 ServiceBehaviour,以便我可以捕获用户未处理的异常并使用以下代码记录错误。
我查看了这个 stackoverflow帖子,但它太旧了,没有发布答案,所以我发布了这个新问题。
更新
我用 grayAlien 提供的答案解决了这个问题(部分暂时)。我所要做的就是
将自定义服务行为类注册到城堡温莎。
/li>从 app.config 文件中删除 serviceBehaviour 扩展。当我在配置文件中添加行为扩展时,由于某种原因,城堡无法注入依赖项,而是我认为 Wcf 正在创建新实例并且记录器公共属性结果为空。
它现在对我有用,但需要了解(将来)如何使用行为扩展来注入依赖项。
c# - IErrorhandler 未返回客户端
我正在尝试实施IErrorhandler
这被证明是一个真正的痛苦!
我已经像这样从界面中实现了provideFault方法IErrorhandler
......
如果我的服务操作遇到异常,它将进入此方法以创建一个FaultException
. 我的问题是客户没有得到这个FaultException
返回给他们。
我在这里遗漏了一些明显的东西吗?
提前致谢
c# - 使用 IErrorHandler 接口处理 Wcf 错误
我有一个关于 WCF 错误异常的问题。我正在实现 IErrorHandler 接口并创建一个FaultException
.
我的问题是:我什么时候创建一个FaultException
,我必须遵循一个模式来向客户发送友好的错误消息吗?
我使用该方法将实际异常记录到数据库并在该方法中HandleError
创建一个。FaultException
ProvideFault
鉴于 delow,有我的 IErrorHandler 接口的示例实现。
我需要弄清楚在方法内部究竟必须做什么ProvideFault
才能向用户返回友好的故障。我还计划使用本地化来显示错误。不确定这是否将由客户端完成,或者服务是否应该发送本地化消息。
根据我阅读的内容,出于安全原因,我不应该将错误或 EntityFramework 错误(如 EntityValidation 错误等)中的堆栈信息发送给客户端。
在这种情况下,我是否需要在发送给客户之前检查异常类型并挖掘更合适的详细信息?
c# - WCF:在 IErrorHandler 中提供通用的 FaultException
一些上下文:我们有一个自定义 XSD 并使用 WSCF.blue 生成 WSDL 和 C# 代码。客户端使用ChannelFactory<T>
并共享接口,该接口包括 WSCF.blue 添加的所有属性以匹配 XSD 中的内容。
我正在尝试实现IErrorHandler.ProvideFault
它提供泛型的地方FaultException<T>
,但在客户端我得到了一个非泛型的FaultContract
. 这是我的ProvideFault
方法的样子:
在每种服务方法中,如果我对其进行尝试/捕获,throw FaultExceptionFactory.CreateFaultException(ex)
它会按预期工作,所以我认为[FaultContract]
、工厂、绑定等都是正确的。以防万一,这就是工厂的工作方式:
我认为问题在于消息是如何创建的IErrorHandler
,也许是在CreateMessageFault()
. 我读过该动作应该是faultException.Action
代替null
,但实际上faultException.Action
是null
。也许这是导致问题的原因。我可以在工厂中设置一个动作,但是这个动作应该是什么,为什么手动投掷不会出现?
我可能缺少的任何其他想法?
编辑: 我检查了 WSDL 并找到了我正在调用的特定操作及其操作:
我尝试对动作进行硬编码:Message.CreateMessage(..., "http://myNamespace/MyMethodBusinessRuleFaultExceptionTypeFault")
并将其设置为.Action
在工厂中,但这仍然不起作用。
编辑 2: throw/catch 生成以下 XML,允许在客户端捕获通用异常:
生成以下IHttpErrorHandler
非泛型FaultException
:
编辑 3:
如果我添加[DataContract]
和[DataMember]
,BusinessRuleFaultExceptionType
那么我得到几乎正确的 XML:
它缺少代码和原因的命名空间。至少我认为这缩小了范围。常规序列化使用[XmlType]
and[XmlElement]
而 theIErrorHandler
使用[DataContract]
and [DataMember]
。不幸[DataMember]
的是不允许你设置命名空间,所以我认为现在的问题是如何在IErrorHandler
. 这描述了我的问题,但由于上述原因,修复不起作用:http: //twenty6-jc.blogspot.com/2011/05/ierrorhandlerprovidefault-serialization.html
编辑4:
我部分发现了这个问题。我们正在使用XmlSerializer
,但由于IErrorHandler
超出了操作范围,因此它恢复为默认值DataContractSerializer
。解决方案是更改您的服务以在任何地方使用,或者在创建故障时DataContractSerializer
手动选择。XmlSerializer
这两篇文章提供了我所需要的:
http://twenty6-jc.blogspot.com/2011/05/ierrorhandlerprovidefault-serialization.html http://zamd.net/2008/08/15/serializing-faults-using-xmlserializer/
这让我非常接近。它与工作 XML 相同,只是缺少异常类型的命名空间:
我认为它没有添加xmlns="http://myNamespace/Services"
,因为它没有请求的上下文。该命名空间是在接口中定义的,但不是数据协定。我真的会被迫留在请求的上下文中(希望IOperationInvoker
有效),而不是使用IHttpHandler
?
c# - WCF FaultException IErrorHandler - 不返回客户端并导致超时异常
我正在尝试在使用 iis 和 net.tcp 的 WCF 服务中实现 IErrorHandler。
我设置了一个在服务器中抛出 DivideByZeroException 的场景。IErrorHandler 正在按预期触发。
FaultException 没有返回给客户端,我收到超时异常。我在事件日志中也找不到任何信息/异常。
这是演示代码。 http://www.fileswap.com/dl/gQFlVsZK7M/(请点击慢速下载图片)
编辑 1(从存档中添加代码供所有人查看):
服务合约:
服务实施:
IErrorHandler 实现:
wcf - WCF、异步和上下文混淆
好吧,我打算将其命名为context 的问题,但显然标题中不允许使用question一词。
无论如何,问题是:我IErrorHandler
在 WCF 服务中使用以提供日志记录,而不会弄乱我的所有服务代码。到目前为止,这工作得很好。但是,现在我正试图转向完全异步服务,我遇到call stack
了返回堆栈而不是因果链的问题。
现在,我尝试使用Stephen Cleary 的逻辑调用上下文 MyStack,并结合Ninject
's Intercept
extensions..
忍者:
简单上下文生成器:
然而,问题是双重的:1)using
在错误实际抛出之前完成,以及 2)1 甚至无关紧要,因为整个上下文在我到达IErrorHandler
. 我可以注释掉 inPop
中的代码MyStack
,并且CurrentContext.IsEmpty
是true
在我点击ProvideFault
时IErrorHandler
。
所以,我的问题也分为两部分:
1)有没有办法让上下文保持到IErrorHandler
通话?
2)如果没有,是否有另一种方法可以在全球范围内记录可以访问上下文的错误?
我正在使用 .NET 4.5、Ninject 3.2 和 DynamicProxy 3.2。
老实说,我很高兴知道异常是在哪里引发的——当前的类和方法足以满足我的目的;不需要完整的堆栈。
编辑:如果我把它放在OperationContext
using 中IExtension<>
,我可以保留它直到我到达IErrorHandler
. 但是,我仍然不知道方法何时结束,所以我无法确定异常发生在哪里。