.NET向webService传double、int、DateTime 服务器得到的数据时null的问题
最近被一个 c#调用 Java web service的问题困扰,查询了一些资料,但都不详尽,于是自己动手做了个示例,发现问题,总结下。。。烦大家拍砖。。
问题现象:
用C#.NET调用Java(使用xfire)开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型、double和DateTime类型的值(在服务端得到的均为null)
问题结症:
简单说一下WebService的工作原理。客户端调用一个WebService的方法,首先需要将方法名和需要传递的参数包装成XML(也就是SOAP包),通常是通过HTTP传递到服务器端,然后服务器端解析这段XML,得到被调用方法名称和传递来的参数,进而调用WebService实例的相应方法。方法执行完成之后,将返回的结果再包装成XML(SOAP响应)发送到客户端,客户端解析这段XML,进而得到返回结果。这里关键的地方在于中间加入了对象和XML相互转换的过程。
由于服务端通过aegis方式对对象的非String属性(int,double,DateTime..)设置了可以为空(nillable="true"),在客户端调用服务方法saveUser(JafUser user)的时候传递一个User对象, 设置了可以为空的非String属性在服务端接收到相对应的NULL值(int类型为0,double类型为0.0,DateTime为NULL)。
以int和double为例 :
服务端程序:ExampleService对外提供saveUser(JafUser user)方法。返回User属性拼接的串。其中User有3个属性: userId ( int类型 ) ,userName(String类型),weight(double类型)。
问题解决(分2步):
1.web服务端Xfire的aegis绑定方式配置。
JafUser.aegis.xml对对象JafUser通过XML传输的设置
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xfire.codehaus.org/schemas/1.0/mapping.xsd">
<mapping>
<property name="userId" style="element" minOccurs="0" maxOccurs="1" nillable="true" />
<property name="userName" style="element" minOccurs="1" maxOccurs="1" nillable="false" />
<property name="weight" style="element" minOccurs="1" maxOccurs="1" nillable="false" />
</mapping>
</mappings>
2.在客户端调用时进行设置。
VS2008封装WebService引用时,如果WebService发布的是一个基本数据类型组成的对象:(以JafUser为例)
a. 该对象中非string属性为minOccurs="0" nillable="true"设置时(表示该属性可以为空)), 则会对该对象的非string属性同时生成两个属性,一般是这样的"属性Field"、"属性××Specified"。而"属性名Specified"是一个bool类型,只有这个属性被设置成true时,"属性Field"的值才会被序列化成xml传递。否则,服务端接收到的值为0(int的话,接收到0)或0.0(double接收到0.0)。
b. 该对象中非string属性为minOccurs="1" maxOccurs="1" nillable="false"设置时(表示该属性不能为空,为必填项),如果该属性不赋值,则服务端则接收到的值为0.0
附:
附件中为示例,客户端为VS2008应用程序。服务端为编译后的程序,解压后直接将里面的xfireService文件夹扔到tomcat的webapps目录中,启动服务后,浏览器中输入http://localhost:8080/xfireService/services/exampleService?wsdl就可看到服务描述文件了,之后,就可以通过VS2008的客户端调试了。。如有问题,留言。。
分享到:
相关推荐
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...
- **调用服务方法**:通过代理类的对象调用JavaWebService中的公开方法,传入参数并接收返回值。 3. **处理数据类型**: C#和Java的数据类型可能会有所不同,比如Java的`Date`在C#中可能是`DateTime`。为了解决...
C# 调用 Java 发布的 WebService 是一种常见的跨语言通信方式。在本文中,我们将介绍如何使用 C# 调用 Java 发布的 WebService。 标题解释 C# 调用 Java 发布的 WebService 终稿是指使用 C# 语言调用 Java 语言发布...
综上所述,要使用C#调用Java带身份验证的Web服务,你需要生成客户端代理类,设置正确的身份验证头,处理XML响应,并确保具备良好的异常处理机制。这涉及到对.NET框架的理解,以及对XML和身份验证协议的熟悉。通过...
### .NET调用Java WebService的关键知识点 #### 一、背景与原理介绍 在实际的软件开发过程中,不同技术栈之间的交互变得越来越普遍。对于.NET应用程序来说,有时需要调用由Java开发的WebService。这种跨平台的服务...
最后,`C#调用使用java的带saophead的webservice-说明书.docx`应该是详细的步骤指南,包含了如何配置和调用Web服务的具体细节。确保按照说明书的指示操作,以确保正确地设置了SOAP Header和调用了Web服务。 总的来...
Java调用C#的WebService是跨平台间通信的一种常见方式,尤其在企业级应用中,可能需要集成不同语言开发的服务。本示例介绍如何在Java环境中利用Xfire库来调用C#编写的WebService服务。 首先,理解WebService的核心...
本主题将深入探讨如何使用C#调用Java编写的Web服务,这通常涉及到Web Service标准如SOAP(Simple Object Access Protocol)或现代的RESTful API。我们将分为服务端和客户端两大部分进行讲解。 一、服务端(Java Web...
因此,在C#调用Java WebService的场景下,Axis2是一个常用的选择。 ### 数据类型转换 在跨语言调用中,数据类型的转换是一个关键步骤。例如,在C#中,字符串类型可能被表示为`System.String`,而在Java中则为`java...
在本例中,"C#调用WebService实例和开发(wsdl).pdf"可能包含详细的步骤和代码示例。 2. **添加引用**:将生成的代理类添加到你的项目中,这样就可以在C#代码中直接调用Web服务的方法。 3. **实例化代理类**:...
本文将详细介绍如何在 ASP.NET 环境下使用 C# 调用 Java WebService。 #### Web Service 定义与特点 根据 W3C 的定义,Web Service 是一种设计用于支持网络上系统之间可互操作的软件系统: 1. **接口描述**:具有...
总结一下,解决C#调用Java WebService服务时遇到的问题通常需要理解和配置协议版本、服务暴露配置以及可能的扩展标准。正确配置这些方面可以确保顺利地进行跨语言和跨平台的服务调用。在实际开发过程中,确保了解两...
动态调用WebService服务是C#中的一个关键技能,它允许程序员在运行时与远程Web服务进行交互,而无需预先知道服务的具体接口或方法。本文将深入探讨如何在C#中实现这一功能,并提供相关知识点。 首先,理解...
通过上述步骤,我们成功地创建了一个 C# 的 Web Service,并且使用 Java 实现了对其的远程调用。这种跨语言的交互方式极大地增强了系统的灵活性和可扩展性,是分布式应用开发中不可或缺的一部分。在未来的工作中,...
总结来说,C#调用Java WebService的关键在于理解WebService的工作原理,正确添加服务引用,使用服务代理类进行调用,并处理返回的数据。这个经典例子——查询天气预报,可以帮助我们更好地掌握这一技能。同时,随着...
标题“C#调用Java的Web Service源代码”暗示了这是一个关于C#客户端如何与Java服务端进行通信的实例。Web Service是一种基于HTTP协议的、平台无关的通信方式,它允许不同系统间的组件通过SOAP(Simple Object Access...
C#动态调用CXF WEBSERVICE框架共通类。
本教程将详细讲解如何使用C#调用J2EE WebService,帮助开发者实现这两种技术的无缝连接。 一、理解基础概念 1. C#:Microsoft .NET框架下的编程语言,广泛用于桌面应用、Web应用以及游戏开发。 2. J2EE(Java 2 ...
总的来说,"C#调用ODI webservice"是一个涉及数据集成、Web服务和客户端应用开发的综合实践。通过掌握这些技术,开发者能够构建起跨平台、实时的数据交换解决方案,提升系统的灵活性和可扩展性。