【问题标题】:WCF IParameterInspector + IErrorHandlerWCF IParameterInspector + IErrorHandler
【发布时间】:2012-10-05 05:11:28
【问题描述】:

如果我同时将IParameterInspectorIErrorHandler 附加到服务,我可以确定IErrorHandler.HandleError() 将在调用IParameterInspector.BeforeCall() 的同一线程上被调用吗?

我需要这个,因为万一抛出错误IParameterInspector.AfterCall() 永远不会被调用,并且没有办法(据我所知)我可以获得在BeforeCall() 中创建的关联状态对象。所以我希望通过在我的接口实现中使用ThreadStatic 字段来克服这个问题:(

【问题讨论】:

    标签: .net wcf error-handling wcf-4 wcf-extensions


    【解决方案1】:

    您可以让实现 IErrorHandler 的类也实现 IParameterInspector。然后,您可以将对相关状态和输入参数的引用存储为类变量。然后可以从 HandleError 方法中访问它们。我目前正在使用它来记录输入参数和每当发生未处理的异常时的原始消息。

    【讨论】:

    • 这正是我正在做的。但是,我想确保这将是线程安全的。
    • 您的服务是 InstanceContextMode PerCall 吗?如果是这样,我相信您会在每次调用时获得该服务的新实例和该服务的 ErrorHandler。
    【解决方案2】:

    您可能想要利用实例上下文扩展。

    InstanceContextExtension: IExtension<InstanceContext>   
    OperationContext.Current.InstanceContext.Extensions.Find<InstanceContextExtension>()
    

    可以在BeforeCall 方法中添加实例上下文扩展。然后可以在AfterCall 方法中检索并使用实例上下文扩展。任何特定于操作的数据都可以放在这个扩展对象中,而不是引入线程亲和性。

    【讨论】:

    • 我不确定是否可以在 IErrorHandler.HandleError() 中访问 OperationContext。几天前尝试了类似的方法并得到了 ObjectDisposedException :(
    • 只是想一想,在IDispatchMessageInspector 接口的AfterReceiveRequest 方法中创建关联状态会是个好主意吗?
    • 我意识到我可以使用 ProvideFault() 而不是 HandleError() 所以你的方法看起来最好! +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多