当前位置:  编程技术>.net/c#/asp.net

解析Silverlight调用WCF/Rest异常的解决方法

    来源: 互联网  发布时间:2014-10-20

    本文导语:  新建Rest服务接口: 代码如下:[ServiceContract]public interface IService1{    [OperationContract]    string GetData(int value);}接着新建一个服务实现类: 代码如下:public class Service1 : IService1{    public string GetData(int value)    {        int i = 0...

新建Rest服务接口:

代码如下:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);
}

接着新建一个服务实现类:
代码如下:

public class Service1 : IService1
{
    public string GetData(int value)
    {
        int i = 0;
        int j = 5 / i;
        return string.Format("You entered: {0}", value);
    }
}

在这里让Service1 抛出”divided by zero exception:”
代码如下:


   
     
       
         
         
       
     
   
   
     
     
   
 

在这里注意

在Silverlight 客户端添加服务引用,名称为:ServiceReference1.

在页面上添加一个按钮,按钮的Click事件代码如下:

代码如下:

private void Button_Click(object sender, RoutedEventArgs e)
{
     Service1Client client = new ServiceReference1.Service1Client();

     client.GetDataCompleted += new EventHandler(client_GetDataCompleted);
     client.GetDataAsync(35); //Try GetData
}

void client_GetDataCompleted(object sender, ServiceReference1.GetDataCompletedEventArgs e)
{
}


运行,结果如下:

可以看到实际的异常是“尝试除以0”,但是由于浏览器限制,所有的异常都是NotFound。

在msdn上有两种方法可以解决这个问题,

最简单的就是在App.xaml.cs代码里面使用RegisterPrefix来使用备用客户端 HTTP 堆栈

代码如下:

public App()
        {
            bool bRegisterPrefix = WebRequest.RegisterPrefix(http://localhost:9541/,

WebRequestCreator.ClientHttp);
            //other Code
        }


再次运行代码:

这是SL调用WCF服务如何处理异常的方式,那么调用Rest服务呢?

首先要修改Web.config 节点下的serviceModel以让它支持Rest。

代码如下:

 

   

     
       
         
       
     

     
       
         
         
       
     

   

   
     
       
     
   

 

在这里要设置webHttp 节点的faultExceptionEnabled=true.并且设置serviceDebug 的includeExceptionDetailInFaults 为true。

OK,服务的Web.config文件已经配置完毕了,接下来要为GetData方法添加WebGet特性修饰了。

代码如下:

public class Service1 : IService1
        {
            [WebGet()]
            public string GetData(int value)
            {
                int i = 0;
                int j = 5 / i;

                return string.Format("You entered: {0}", value);
            }
        }

运行:

地址为:http://localhost:9541/Service1.svc/help

接着输入地址:http://localhost:9541/Service1.svc/GetData?value=3

可以看到得到了异常信息了。

注意:别忘记了添加跨域和授权文件:crossdomain.xml 和 clientaccesspolicy.xml 到网站根目录。

同样,修改SL客户端页面,添加一个Button,button的代码事件为:

代码如下:

private void btnRest_Click(object sender, RoutedEventArgs e)
        {
            WebClient wc = new WebClient();

            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(

wc_DownloadStringCompleted);
            wc.DownloadStringAsync(new Uri("http://localhost:9541/Service1.svc/GetData?value=3"));
        }

        void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                throw e.Error;
            }
        }

运行,点击btnRest

可以看到,Rest 调用的结果仍然是NotFound。

提示让我们查看Response属性和Status属性。

就看看Respone属性的ResponseStrem是什么吧。

可以看到errorMessage 就是返回的错误,很明显,我们需要对它反序列化成Exception的对象。

首先尝试使用DataContractSerializer来反序列化为FaultException类

因为我们尝试反序列化为FaultException类,但是XML数据的Element名称为Fault。所以失败,难道是有Fault类 ?可是找了很久也没发现Fault类。

但是在ReadObject方法中发现了一个verifyObjectName的重载。

将代码修改为:

代码如下:

DataContractSerializer serializer = new DataContractSerializer(
typeof(FaultException));

//object deserializerObject = serializer.ReadObject(errorStream);
object deserializerObject = serializer.ReadObject(XmlReader.Create(errorStream),false);

重新运行:

可以发现虽然序列化是成功的,但是序列化后的值全部是错误的。

最后没办法既然有XML的异常数据,那么可以尝试解析xml数据并使用自定义异常。

首先新建SLFaultException 类,继承Exception:代码如下:

代码如下:

public class SLFaultException : Exception
        {
            public ExceptionDetail Detail { get; set; }

            public SLFaultException() { }
            public SLFaultException(string message) : base(message) { }
            public SLFaultException(string message, ExceptionDetail detail)
                : base(message)
            {
                Detail = detail;
            }
        }


完整的代码如下:
代码如下:

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                if (e.Error is WebException)
                {
                    WebResponse errorResponse = ((WebException)e.Error).Response;

                    Stream errorStream = errorResponse.GetResponseStream();

                    XElement rootElement = XElement.Load(errorStream);
                    XElement detailElement = rootElement
                    .Descendants()
                    .First(el => el.Name.LocalName == "ExceptionDetail");

                    DataContractSerializer serializer = new DataContractSerializer(
                    typeof(ExceptionDetail));
                    ExceptionDetail exceptionDetail = (ExceptionDetail)serializer.ReadObject(

detailElement.CreateReader(), true);

                    SLFaultException faultException = new SLFaultException(

exceptionDetail.Message, exceptionDetail);

                    throw faultException;
                }
            }
        }


虽然序列化为FaultException是失败的,但是xml节点的ExceptionDetail是可以被反序列回来的,当然上面的处理WebException的过程是可以被封装的,读者自己尝试下吧,呵呵。

结果如下图:


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 急!请问一个域名解析问题。很奇怪的。请忙解决一下
  • MySQL连接无法解析HOST主机名的解决方法
  • JAVA 里用XSL解析XML文档时中文问题的解决,请教各位!
  • android layout XML解析错误的解决方法
  • 请教:LINUX下有没有能象source insight那样解析并阅读代码的工具?解决问题50分相送!
  • JSP 不能解析EL表达式的解决办法
  • crawler4j抓取页面使用jsoup解析html时的解决方法
  • 解析在MySQL里创建外键时ERROR 1005的解决办法
  • IE6不能正常解析CSS文件问题的解决方法及原因分析
  • c#使用nsoup解析html乱码解决方法分享 nsoup教程
  • newtonsoft.json解析天气数据出错解决方法
  • 禁止mysql做域名解析(解决远程访问mysql时很慢)
  • VC++开发中完美解决头文件相互包含问题的方法解析
  • a2sd+状态下应用程序丢失的解决方法详细解析
  • 解析Android游戏中获取电话状态进行游戏暂停或继续的解决方法
  • error LNK2019: 无法解析的外部符号 问题的解决办法
  • Android中使用pull解析器操作xml文件的解决办法
  • java中使用sax解析xml的解决方法
  • c#中XML解析文件出错解决方法
  • 解析StreamReader与文件乱码问题的解决方法
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 如何用libxml2 默认解析器解析HTML文件
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • html中<radio>单选按钮控件标签用法解析及如何设置默认选中
  • 配置DNS服务器后,服务器可解析,客户端不能解析。求解
  • Python下Html/xml解析库Beautiful Soup快速入门教程
  • 为什么我在使用nslookup命令的时候,正向解析(域名-》ip)没有问题,反向解析(ip-》域名)怎么查不到呢?
  • 基于Python的html解析库:pyquery最新版主页及pyquery下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3