WCF 第十章 异常处理 实现客户端错误处理器

时间:2022-08-29 08:33:47

如果你已经使用FaultContract属性声明你的服务操作来定义与任何抛出的错误一起的数据契约,你的服务的WSDL描述将会包含在那些数据契约的细节中。这将允许你或者其他人创建对那些契约的细节和类型有完全访问权限的客户端处理单元。

  使用异常处理扩展先前的一个基本的客户端服务的实现例子,列表10.12 描述了基于TrackedFault数据契约的强类型FaultException是如何被结构化处理的?

列表10.12 处理非类型化FaultExceptions

        public double Divide(double numerator, double denominator)
        {
            try
            {
                //Call a service operation
            }
            catch (FaultException<TrackedFault> tfexp)
            {
                //Full and strongly typed access to TrackedFault details

                //TrackedFault properties are avaliable via the Detail
                //Property of the FaultException<> type
                Console.WriteLine("A problem has been encountered and recorded. Please reference Id " + tfexp.Detail.TrackingId + " when contracting support.");
            }
            catch (FaultException fexp)
            {
                //Process other WCF exceptions
                //Inspect Reason, Code, Message, etc. to determine action
            }
            catch (Exception exp)
            {
                //Process any other exceptions, perhaps local to the proxy
            }
        }

  通过服务的WSDL暴露TrackingFault的细节允许一个代理生成工具为每个TrackingFault的成员创建强类型化属性。一个客户端异常处理器可以使用FaultException<>实例属性细节来访问加密数据契约细节。在列表10.12 中,用户通过访问类型化异常实例的Details.TrackingId属性来获取跟踪源ID。

  记住对所有的.NET异常代码来说,捕获异常的区域顺序是重要的。FaultException<TrackedFault>用最特殊的类型,所以应该是第一个。因为FaultException比Exception特殊(FaultException所继承的类型),所以它应该是下一个,在Exception后面,也就是最后一个。

  这个例子中已经包含了完全实现细节,但是应该包含日志异常细节的很多选项来通知用户,放弃或者重试服务调用。

错误处理应用块

微软实践组创建了指导和工具来帮助记录在当前可用技术和强烈建议的最好实践之间的差异性。企业库是一个代码集成库的免费集合,称作应用程序块,可以快速地将可用实践应用到一个应用程序中。

  企业库(当前版本3.1)的最近一次发布包含了与.NET Framework 3.0 和 3.5 的一些功能集成的特性。其中的一个包含在企业库总的应用程序块叫做异常处理应用程序块,可以用来定义在一个应用中处理异常的策略。例如,你可能创建一个所有数据相关的异常都被记录而且是新的策略,原始的异常在原始异常位置重新抛出。

注意 企业库的更多内容

由于企业库关联.NET 3.x 所以更全面的介绍超过了本书的范围,但是细节可以在http://msdn.com/practices 找到。

异常防护

企业库的最近一次发布版扩展了异常处理应用程序块的功能来提供一个称作异常防护的特性。它使用一个新的属性,ExceptionShielding,可以在当一个服务被访问时调用一个异常策略。与FaultContractExceptionHandler联合使用,你可以异常容易地通过你的操作将抛出的.NET 异常转换成玉一个目标数据契约相关的强类型化FaultException<>实例。

  处理其他的诸如包装,替代和日志处理器,FaultContractExceptionHandler 基于配置文件,可以用来在一个抛出的异常和由一个FaultContract属性确定的数据契约间执行字段映射。

  考虑将异常防护作为捕获并转换所有或者一个特殊的没有准备好使用这章描述的技术之一来处理的异常类型子集。

  为WCF异常防护使用企业库的细节和例子可以在MSDN http://msdn2.microsoft.com/en-us/library/aa480591.aspx 中找到。