WizardWu 編程網

一位台灣的工程師,接觸 .NET 逾十年,近年研究 SQL Server、Performance Tuning、手機應用

博客园 首页 新随笔 联系 订阅 管理

本帖示范在 WCF 中,如何用 FaultContractAttribute 指定 SOAP 错误,并搭配泛型的 FaultException<自订类> 去封装自订的错误讯息,以回传给客户端。本帖提供 WCF + ASP.NET 3.5 的示例下载。

-------------------------------------------------
本帖的示例代码下载点:
https://files.cnblogs.com/WizardWu/090103.zip
(执行本示例,需要 Visual Studio 2008 + SP1,不需要数据库)
-------------------------------------------------

用 VS 2008 + SP1,双击 WcfServiceLibrary1.sln 打开 solution 后,直接按 F5 执行示例,可看到下图 1 的画面。当您在 TextBox 输入数字并按 Button 时,WCF Service 会用 int.Parse 方法,将输入的字符串转型成数字;当您输入的非数字时,就会在 WCF 中引发转型错误,接着会在 Service1.cs 中抛回一个 FaultException<TDetial>。


图 1

FaultContract attribute 可将一个 operation 宣告成可输出错误,并可指定用哪种 type 来封装 fault 细节信息 (注意,fault 不等于 exception)。本帖下载示例的 IService1.cs 中,我们将接口中的 GetData 方法,用 FaultContract attribute 宣告成遇到 SOAP 错误时,可传回这些错误,如下:

IService1.cs

 

上方代码中,我们还看到一个自订类 FaultInfo,是用来提供相关的错误信息,并要在实作 IService1 接口的 Service1 类中,将自订的错误信息封装在泛型 FaultException 类中,亦即 FaultException<FaultInfo>,以便在发生转型错误时,将信息抛出至客户端的 Code-Behind 程序中 (Default.aspx.cs),如下:

Service1.cs

 

当然,您也可用旧式非泛型的 FaultException 类,或 FaultException<string> 直接指派自订的错误讯息,如下:
throw new FaultException<string>("您输入的数字不合理");


此外,我们自订的 GetData 方法,MEP (Message Exchange Patterns) 不可宣告为 one-way,如下:
[OperationContract(IsOneWay = true)]
[FaultContract(typeof(FaultInfo))]
int GetData(string value);

否则客户端项目在引用这个 WCF Service 会引发「无法更新服务参考」的错误,因此我们用 MEP 的默认值「Request/Response」。


引用这个 WCF Service 的客户端 ASP.NET 项目,其 Default.aspx.cs 代码如下:

Default.aspx.cs

 

上方代码中的 Detail 属性,为 FaultException<TDetail> 泛型类所特有的属性,里然包含错误的详细信息,但旧式非泛型的 FaultException 类没有这个属性。


建置 solution 完成后,若您去浏览 WSDL,会发现里面有 fault contract 的相关信息。


-----------------------------------

参考书籍:

[1] Microsoft .NET Framework 3.5-Windows Communication Foundation, MCTS EXAM 70-503 Training Kit
http://www.microsoft.com/learning/en/us/Books/12486.aspx
http://www.amazon.com/MCTS-Self-Paced-Training-70-503-PRO-Certification/dp/0735625654

-----------------------------------

参考文件:

[2] MSDN Library

FaultContractAttribute 类:
http://msdn.microsoft.com/zh-cn/library/system.servicemodel.faultcontractattribute.aspx

FaultException<TDetail> 泛型类:
http://msdn.microsoft.com/zh-cn/library/ms576199.aspx

FaultException<TDetail>Detail 属性:
http://msdn.microsoft.com/zh-cn/library/ms575596.aspx


[3] WCF学习----我的第一个WCF程序
http://www.cnblogs.com/ASPNET2008/archive/2008/06/01/1211613.html

-----------------------------------

 

posted on 2009-01-03 03:13  WizardWu  阅读(1599)  评论(1编辑  收藏  举报