注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

我的WCF之旅(10):如何在WCF进行Exception Handling(下篇)  

2011-03-28 09:17:51|  分类: WCF |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

接着我们在Service Implementation中以抛出Exception的方式植入这个MathError对象:

using System;
using System.Collections.Generic;
using System.Text;
using Artech.ExceptionHandling.Contract;
using System.ServiceModel;

namespace Artech.ExceptionHandling.Service
我的WCF之旅(10):如何在WCF进行Exception Handling(下篇) - 海里的贝壳 - apple的博客
{
    
public class CalculatorService:ICalculator
我的WCF之旅(10):如何在WCF进行Exception Handling(下篇) - 海里的贝壳 - apple的博客    
{
我的WCF之旅(10):如何在WCF进行Exception Handling(下篇) - 海里的贝壳 - apple的博客      
#region ICalculator Members

        
public double Divide(double x, double y)
我的WCF之旅(10):如何在WCF进行Exception Handling(下篇) - 海里的贝壳 - apple的博客        
{
            
if (y == 0)
我的WCF之旅(10):如何在WCF进行Exception Handling(下篇) - 海里的贝壳 - apple的博客            
{
                MathError error 
= new MathError("Divide""Divided by zero");
                
throw new FaultException<MathError>(error,new FaultReason("Parameters passed are not valid"),new FaultCode("sender"));
            }


            
return x / y;
        }


        
#endregion

    }

}

在被除数为0的时候,抛出FaultException<MathError> Exception,并指定具体的MathError对象,以及一个FaultCode(一般指明出错的来源)和FaultReason(出错的原因)。

我们现在先不修改Client的Exception Handling的相关代码,先运行Hosting,看看WSDL中什么特别之处:


通过上面的Screenshot,我们可以看到,在PortType section中的Divide Operation定义了Message为tns:ICalculator_Divide_MathErrorFault_FaultMessage 的<wsdl:fault>节点。通过查看Message Section,我们发现tns:ICalculator_Divide_MathErrorFault_FaultMessage的Element为q1:MathError,该q1:MathError type实际上是被定义在一个XSD中,其Uri为http://localhost:8888/Calculator?xsd=xsd2,我们定义的所有DataContract都在其中,下面的整个内容:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/Artech.ExceptionHandling.Contract" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/Artech.ExceptionHandling.Contract">
  
<xs:complexType name="MathError">
    
<xs:sequence>
      
<xs:element minOccurs="0" name="ErrorMessage" nillable="true" type="xs:string"/>
      
<xs:element minOccurs="0" name="Operation" nillable="true" type="xs:string"/>
    
</xs:sequence>
  
</xs:complexType>
  
<xs:element name="MathError" nillable="true" type="tns:MathError"/>
</xs:schema>

弄清楚了Fault在WSDL中表示后,我们来修改我们Client端的代码,来有效地进行Exception Handling:

static void Main(string[] args)
我的WCF之旅(10):如何在WCF进行Exception Handling(下篇) - 海里的贝壳 - apple的博客        
{
            ChannelFactory
<ICalculator> calculatorFactory = new ChannelFactory<ICalculator>("defualtEndpoint");
            ICalculator calculator 
= calculatorFactory.CreateChannel();
            
try
我的WCF之旅(10):如何在WCF进行Exception Handling(下篇) - 海里的贝壳 - apple的博客            
{
                Console.WriteLine(
"Try to invoke Divide method");
                Console.WriteLine(
"x / y =  {2} when x = {0} and y = {1}"20, calculator.Divide(20));
            }

            
catch (FaultException<MathError> ex)
我的WCF之旅(10):如何在WCF进行Exception Handling(下篇) - 海里的贝壳 - apple的博客            
{
                MathError error 
= ex.Detail;
                Console.WriteLine(
"An Fault is thrown.\n\tFault code:{0}\n\tFault Reason:{1}\n\tOperation:{2}\n\tMessage:{3}", ex.Code, ex.Reason, error.Operation, error.ErrorMessage);
            }


            
catch (Exception ex)
我的WCF之旅(10):如何在WCF进行Exception Handling(下篇) - 海里的贝壳 - apple的博客            
{
                Console.WriteLine(
"An Exception is thrown.\n\tException Type:{0}\n\tError Message:{1}", ex.GetType(), ex.Message);
            }

            Console.Read();
        }

下面是运行后的输出结果:


作者:Artech 
出处:http://artech.cnblogs.com 

  评论这张
 
阅读(534)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017