`
liyuandong
  • 浏览: 331712 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

详解WebService开发中四个常见问题

阅读更多

详解WebService开发中四个常见问题

问题一:WebService与方法重载

首先说明,WebService不支持方法重载。下面举例说明。

例如定义如下WebService接口:

1 @WebService
2 public interface IHello {
3         @WebMethod
4         public String sayHello(int id);
5 
6         @WebMethod
7         public String sayHello(String name);
8         
9         @WebMethod
10         public String sayHello2(int id);
11 
12         @WebMethod
13         public String sayHello2(int id, String name);
14     }

先来看方法sayHello(),如果客户端发送如下SOAP请求:

1 <soap:Envelope>
2         <soap:Body>
3             <sayHello>
4                 <arg0>11</arg0>
5             </sayHello>
6         </soap:Body>
7     </soap:Envelope>

从SOAP请求我们可以看出客户端需要调用方法为sayHello(),所传递的参数为11,但是无法知道是整数的11,还是字符串"11",所以也就无法确定所调用的方法是哪一个。

接下来看一下sayHello2(),如果客户端传递的参数只包括一个id值,例如:

1 <soap:Envelope>
2         <soap:Body>
3             <sayHello2>
4                 <arg0>1</arg0>
5             </sayHello2>
6         </soap:Body>
7     </soap:Envelope>

还是无法判断调用的是哪个方法,因为可以理解为客户端传递的第二个参数为空(Null)。

通常情况下,在发布一个含有重载方法的WebService时会有异常发生,或者当调用一个方法时,服务器端报告找不到相对应的方法。

问题二:我的数据被修改了?

先来看WebService接口:

1 @WebService
2     public interface IHello {
3     
4         @WebMethod
5         public String sayHello(IPerson person);
6     
7     }
8     
9     public interface IPerson {
10         ...
11     }
12     
13     public class Person implements IPerson{
14         ...
15     }

这里需要注意的是WebService的方法sayHello()的参数是一个接口,而不是一个具体类(例如Aegis绑定就允许直接发布这样的 WebService)。在客户端调用sayHello()的时候传递一个Person对象,它实现了IPerson接口。经过中间一系列的XML和对象 之间的转换过程,服务器端得到的只是一个实现了IPerson接口的实例,它不一定就是一个Person对象,如果要强制将其转换为Person,就有可 能抛出异常。

问题的根源在于Aegis将XML转换为Java对象是通过Proxy或CGlib这类的工具生成一个“代理类”实现IPerson接口,然后创建这个代理类的一个实例,那它肯定不是一个Person了。

问题三:循环引用

还是先来看一个例子。下面是WebService的接口:

1 @WebService
2     public interface IHello {
3     
4         @WebMethod
5         public String sayHello(Teacher teacher);
6     
7     }
8     
9     public class Teacher {
10         private Student[] students;
11         
12         //getters and setters
13         ...
14     }
15     
16     public class Student {
17         private Teacher teacher;
18         
19         //getters and setters
20         ...
21     }

请注意,Teacher和Student是一对多的“双向”关系。在这种情况下,我们可以想一下如何将一个Teacher对象转换成一段XML?

您可能想到下面的答案:

1 <teacher>
2         <students>
3             <teacher>
4                 <students>
5                     <teacher>
6                         <students>
7                             ...
8                         </students>
9                         ...
10                     </teacher>
11                 </students>
12                 ...
13             </teacher>
14         </students>
15         
16         <students>
17             ...
18         </students>
19         ...
20     </teacher>

看到了吧,XML竟然也会进入“死循环”。问题的根源在于对象之间的循环引用。这种问题通常在客户端发送WebService请求之前就会抛出异常,因为无法将这个对象转换为可传输的XML。

问题四:庞然大物

还是先看一个例子,下面是WebService的接口:

1 @WebService
2     public interface IHello {
3     
4         @WebMethod
5         public String sayHello(Student[] students);
6     
7     }
8     
9     public class Teacher {
10         ...
11     }
12     
13     public class Student {
14         private Teacher teacher;
15         
16         //getters and setters
17         ...
18     }

这个方法接收一个Student数组,包含成百上千个Student,与上面例子不同的是Student和Teacher现在是多对一的单向关系, 所以不会有“循环引用”的问题。假设所有这些Student的Teacher是一个人。我们试着将这个Student数组对象转换为一段XML,如下:

1 <student>
2     <teacher>
3                 ...
4         </teacher>
5     </student>
6 <student>
7     <teacher>
8                 ...
9         </teacher>
10     </student>
11     ...

问题出来了,看到了没有,每个Student节点下面都有一个Teacher节点,当这段XML被接收方转换为Student数组时,每个学生都有 了一个自己的老师,Teacher对象被复制了成百上千次,经过这么一个转换--传输--转换的过程,这个数组对象真的成了一个“庞然大物”。

问题的根源在于Student和Teacher之间的关系是多对一,当传送“多”方时,“一”方有可能会被复制多次。从而占用大量网络传输带宽和内 存。在这里参数不一定非要是一个集合或者数组,例如ObjectA和ObjectB都有一个对ObjectC的引用,经过SOAP传送过 后,ObjectC就由一个变成两个了,分别属于ObjectA和ObjectB,而不再是共享一个ObjectC了。

分享到:
评论

相关推荐

    WebService发布过程及常见问题(含Win7)

    ### WebService发布过程及常见问题解析 #### 一、创建Web服务项目 1. **启动Visual Studio (VS):** - 打开VS,选择“文件”&gt;“新建”&gt;“网站”&gt;“ASP.NET Web服务”。 2. **创建Web服务项目:** - 在创建过程中...

    webservice调用常见问题

    在使用Visual Studio 2008进行Web开发的过程中,开发者可能会遇到一个常见的问题:在建立了Web Service应用程序之后,尝试在ASP.NET环境中调用该服务时,往往会出现调用失败的情况,并且会收到“本窗口只能在本机...

    Flex+WebService开发实例

    《Flex与WebService开发实例详解》 Flex是一种基于Adobe Flash Platform的开源框架,主要用于构建富互联网应用程序(Rich Internet Applications,简称RIA)。它允许开发者创建交互性强、用户体验良好的动态Web应用...

    基于Jdeveloper进行WebService开发及部署.docx

    - **注意事项**:指出开发过程中需要注意的关键问题,避免常见错误。 - **高级应用**:探讨更复杂的场景和高级功能,提升Webservice的服务能力。 - **参考文档**:提供进一步学习和研究的相关资料链接。 #### 环境...

    C#WebService发布和IIS配置以及部分问题解决

    ### C# WebService 发布与 IIS 配置详解及常见问题解决 #### 一、IIS 安装与配置 在开始之前,确保已经安装了 Windows 的 Internet 信息服务 (IIS)。以下是如何安装 IIS 的步骤: 1. **打开控制面板**:通过开始...

    Java+Webservice调用方式详解

    ### Java+Webservice调用方式详解 #### 一、引言 随着互联网技术的发展与企业级应用需求的增长,Web服务(Webservice)作为一种基于XML的标准协议,在不同平台间实现服务互操作方面扮演着越来越重要的角色。Java...

    vb6.0调用webservice详解

    在VB6.0中调用Web服务(Webservice)是一个常见的任务,特别是在旧版软件集成新功能时。本文将深入探讨如何在Visual Basic 6.0中与Web服务交互,提供一个详细的步骤指南,并结合实际例子来阐述这个过程。 首先,...

    用Java程序访问Net WebService.doc

    * Java EE 5 中,使用标注(annotation)减少了 Web Services 的代码量与部署工作:在 Java EE 5 中,可以使用标注(annotation)来减少 Web Services 的代码量与部署工作,从而简化WebService 的开发和部署过程。

    webservice参数的获取.docx

    在实际开发过程中可能会遇到一些常见问题,比如获取不到WSDL文件、参数不匹配等问题。解决这些问题的方法包括: - **确认URL是否正确**:确保提供的WSDL文件URL是有效的,并且能够成功访问。 - **检查WSDL文件格式*...

    android webserviceandroid webserviceandroid

    在Android开发中,客户端应用程序与服务器端进行数据交互是非常常见的需求之一。这种交互可以通过多种方式实现,其中一种常用的方式就是使用WebService。WebService提供了一种标准的方式来发布、查找以及调用通过...

    ajax异步调用webservice实例

    总结,AJAX异步调用WebService是现代Web应用中常见的一种通信方式,它极大地提升了用户体验。理解并掌握这一技术,对于Web开发者来说至关重要。通过实际的代码示例和不断的实践,你可以更深入地理解和应用这个技术。

    android 调用.net webservice

    在Android开发中,与服务器进行交互是必不可少的一个环节。常见的交互方式包括HTTP请求、RESTful API等,而WebService作为一种传统但依然广泛使用的通信协议,也经常被用于Android应用与后端服务之间的数据交换。...

    eclipse自带webservice调试工具介绍

    ### Eclipse 自带WebService调试工具详解 #### 一、引言 在进行跨平台或跨系统的数据交互时,WebService因其开放性和灵活性而成为一种常见的技术手段。Eclipse作为一款流行的集成开发环境(IDE),内置了丰富的功能...

    python调用WEBSERVICE接口

    ### Python调用WEBSERVICE接口知识点详解 #### 一、基础知识概述 1. **Web Service**:一种跨编程语言和操作系统平台的远程调用技术,它通过HTTP协议提供服务,可以被任何其他系统调用。 2. **SOAP(Simple Object...

    android、webService 天气预报demo

    在移动应用开发中,实时获取天气信息是常见的功能之一。本Demo结合了Android客户端和WebService技术,为用户展示如何从远程服务器获取并展示天气预报数据。通过这个实例,我们可以深入理解Android网络编程以及与...

    xfire webservice 上传下载源码

    在"xfire webservice 上传下载源码"这个主题中,我们将深入探讨如何使用XFire来实现文件的上传和下载功能,以及相关的核心概念和技术细节。 **一、XFire简介** XFire是Apache CXF的前身,其设计目标是简化Web服务的...

    LoadRunner测试webservice

    #### 三、常见问题及其解决方案 1. **问题**:“server returned an incorrectly formatted SOAP response” 错误。 - **解决方案**:安装 LoadRunner 8.0 的 Web Services 补丁,包括 `LR80WebServicesFP1_setup....

Global site tag (gtag.js) - Google Analytics