由于做到的项目需要跟别的系统交互,我们这边提供wsdl文档给其他系统的开发人员,今天测试的时候,用C#来根据wsdl生成的客户端调用Java的Web Server时,连最简单的返回string类型获取的值都是null,但是如果直接根据Web服务产生的wsdl来生成C#客户端,就能正常返回值.对比了下原wsdl文档与Web服务产生的wsdl文档,发现之间没有什么区别。
后来把利用wsdl.exe和wsdl文档生成的客户端代码与直接在项目中引用Java的Web服务产生的代码对比一下。发现只有一个地方不同,就是在调用Web 服务的方法中返回值特性中存在差异:根据wsdl 工具生成的客户端代码的是 [return: System.Xml.Serialization.XmlElementAttribute("out", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)];直接引用Web服务的客户端代码是 [return: System.Xml.Serialization.XmlElementAttribute("out")],直接去掉Form = System.Xml.Schema.XmlSchemaForm.Unqualified这个属性,原来利用工具生成的客户端调用Java Web服务也能正确获取返回值了。
System.Xml.Schema.XmlSchemaForm这个枚举中有三个值:None,Qualified,Unqualified,代表的意思是架构中不指定元素和属性窗体、必须用命名空间限定元素和属性、不要求用命名空间限定元素和属性。这个属性存在于跨平台调用时如果wsdl文档没有设计好,可能就会会在返回值为null的问题了。例如wsdl中的<xsd:schema />元素中没有设定attributeFormDefault和elementFormDefault属性,则默认值是qualified。这样当在Java中生成Web服务时,消息传送时会带上命名空间。而在C#里利用wsdl工具生成的客户端中,则会在schem声明的各个元素中默认加上Form = System.Xml.Schema.XmlSchemaForm.Unqualified,当调用Java的web 服务获取返回值时,接收消息的时候不会带上命名空间,这样一来,双方的消息格式不一致,就造成了获取值为null。
除了在设计wsdl时在<xsd:schema />中设置attributeFormDefault和elementFormDefault属性来避免这个外,还可以修改客户端代码,例如直接在C#的客户端代码中把Form = System.Xml.Schema.XmlSchemaForm.Unqualified取消或者设置Qualified。
分享到:
相关推荐
Java解析WSDL文档获取方法与参数涉及到的技术点包括:了解WSDL的基本概念,使用Apache CXF或其他类似库,加载和解析WSDL文档,获取服务、端点、操作和消息信息,最后可能还需要生成Java客户端代码以便于调用服务。...
在.NET Framework中,我们可以使用System.Web.Services.Description命名空间中的ServiceDescription类来下载WSDL数据。 第二步:创建和格式化WSDL文档文件 使用ServiceDescription类下载WSDL数据后,我们需要使用...
Java 调用 WSDL 是一种常见的技术,它允许 Java 应用程序调用远程的 Web 服务。Web 服务是使用 WSDL(Web Service Descriptive Language)文件来描述的,它定义了服务的接口、操作和参数。 WSDL 文件描述了 Web ...
在Java中访问.NET Web服务的第一步是生成客户端代理类。这通常通过WSDL(Web Service Description Language)文件完成,该文件描述了Web服务的接口和操作。使用工具如`wsimport`命令或者IDE中的功能,可以自动生成与...
Web服务是一种基于标准协议...总结,Java Web Service客户端的开发涉及多个步骤,从获取服务描述到生成客户端代码,再到编写应用程序进行调用。理解这些基本概念和技术将有助于你在实际项目中有效地集成和利用Web服务。
最后,我们可以在客户端使用代理类来调用 Web 服务。我们可以使用以下代码: ```csharp WebService service = new WebService(); // 代理类 NetworkCredential netCredential = new NetworkCredential("test", ...
在JAX-WS中,可以使用`WSDL2Java`工具从服务的WSDL文档生成客户端代码。这个过程通常包括以下步骤: 1. 使用`wsimport`命令行工具,如`wsimport -keep -s src -p ...
1. **服务消费者**:客户端应用程序可以使用WSDL4J解析WSDL来理解和调用Web服务。 2. **服务生成器**:工具或框架(如Axis,CXF等)使用WSDL4J自动生成服务客户端或服务器端代码。 3. **测试工具**:测试框架可能...
### C#.NET 动态调用WebService的三种方式详解 #### 概述 在日常的.NET开发工作中,我们经常需要与远程服务器上的服务进行交互,其中WebService作为一种常见的服务交互方式被广泛采用。多数情况下,我们会选择通过...
【动态调用 WebService】在.NET Framework中,动态调用Web Service是一种灵活的方法,尤其适用于那些在运行时才知道要调用哪个服务或服务地址的情况。这种方法避免了提前生成客户端代理类的限制,使得程序更加适应...
此外,WSDL文件是定义Web服务接口的关键,它包含了服务的地址、操作、消息格式等信息,是生成客户端代理代码的基础。 总结来说,调用SAP NetWeaver上的WebService涉及的主要知识点包括: - Java编程基础 - ...
3. **创建客户端代理**:在选定的编程语言中,使用WSDL文件生成客户端代理类或库,这将帮助我们方便地调用BIEE的Web服务方法。 4. **身份验证**:BIEE Web服务通常需要认证,可能需要提供用户名、密码,或者使用...
3. **编写服务代码**:根据生成的服务骨架,实现具体的业务逻辑。这些逻辑将被包装在一个Java类中,该类通常继承自由WSDL2Java生成的抽象类。 4. **打包服务**:将服务相关的Java类和依赖库打包成一个aar(Axis2 ...
1. **代码生成**:Axis可以从现有的Java类生成WSDL(Web Services Description Language)文件,这是一个XML文档,定义了Web服务的接口。反过来,它也可以从WSDL文件生成Java代码,这样开发者就可以直接与服务进行...
使用gSOAP的`soapcpp2`工具,根据Web服务的WSDL文件生成C++客户端代码。例如,如果你的WSDL文件名为`service.wsdl`,在命令行中运行: ``` soapcpp2 -I/usr/local/include -L/usr/local/lib -lstdc++ service....
客户端调用远程Web服务的第一步是获取WSDL(Web Service Definition Language)文件,它定义了服务的接口和消息格式。使用CXF的`wsdl2java`工具,将WSDL文件转换为Java代码。以下是一些常用的`wsdl2java`命令行选项...
与静态调用相比,动态调用无需预先知道服务的具体接口和实现,而是通过WSDL(Web Services Description Language)文件来获取服务的元数据,然后在运行时自动生成客户端代理类。 2. **Axis2简介**: Axis2是基于...
确保正确配置了服务的WSDL(Web Service Description Language)信息,WSDL文件是Web服务的规范文档,描述了服务的接口、消息格式和调用方式。 - 接下来,你需要将服务部署到一个支持xFire的服务器上。这可能是一个...
在C#编程中,动态调用WebService是一种高级技巧,它允许你在运行时根据需要调用不同的Web服务,而不需要在编译时就确定具体的URL或方法。这种灵活性尤其有用,当你需要处理Web服务URL变动或者需要动态选择服务时。...