.NET向WebService传值为decimal、double、int、DateTime等非string类型属性时,服务器端接收不到数据的问题

最近在做CRM项目时,使用C#调用SAP PI发布的WebService服务时遇到的问题: 向WebService传值为decimal、double、int、DateTime等非string类型数据时,服务器端接收不到数据。查询了很多资料,终于解决了问题,总结如下。

问题现象:

用C#.NET调用PI开发的WebService时,在客户端将封装的带有decimal属性的对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int、double、decimal类型和DateTime类型的属性值

问题结症:

    简单说一下WebService的工作原理。客户端调用一个WebService的方法,首先需要将方法名和需要传递的参数包装成XML(也就是SOAP包),通常是通过HTTP传递到服务器端,然后服务器端解析这段XML,得到被调用方法名称和传递来的参数,进而调用WebService实例的相应方法。方法执行完成之后,将返回的结果再包装成XML(SOAP响应)发送到客户端,客户端解析这段XML,进而得到返回结果。这里关键的地方在于中间加入了对象和XML相互转换的过程。

由于服务端对象的非String属性(int,double,decimal,DateTime...)设置了可以为空(minOccurs="0"),在客户端调用服务方法SI_Create(I_Customer customer )的时候传递一个Customer对象,设置了可以为空的非String属性在服务端接收不到属性数据。

    以decimal为例 :

    服务端程序:SI_Customer_Out_SynService对外提供SI_Create(I_Customer customer )方法,返回Customer编号,其中Customer包含属性: UMSA1(decimal类型)。

    问题解决
    1.Web服务端配置

<xsd:element name="UMSA1" minOccurs="0">
    <xsd:annotation>
        <xsd:documentation>Annual sales</xsd:documentation>
    </xsd:annotation>
    <xsd:simpleType>
        <xsd:restriction base="xsd:decimal">
            <xsd:totalDigits value="15"/>
            <xsd:fractionDigits value="2"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>

      2.在客户端调用时进行设置

VS2013封装WebService引用时,如果WebService发布的是一个基本数据类型组成的对象,则进行如下设置:

a.  该对象中非string属性为minOccurs="0" 设置时(表示该属性可以为空)),则会对该对象的非string属性同时生成两个属性,一般为"属性名Field"、"属性名Specified"。而"属性名Specified"是一个bool类型,只有这个属性被设置成true时,"属性Field"的值才会被序列化成xml传递。否则,服务端接收不到属性值。

b.  该对象中非string属性为minOccurs="1" maxOccurs="1"设置时(表示该属性不能为空,为必填项),如果该属性不赋值,则服务端则接收到的值为0.00。

参考:http://liyuandong.iteye.com/blog/782246

原文地址:https://www.cnblogs.com/imagenation/p/10025403.html

时间: 2024-08-28 06:43:25

.NET向WebService传值为decimal、double、int、DateTime等非string类型属性时,服务器端接收不到数据的问题的相关文章

.net调java写的webService传过去的datetime,int等非string类型为null的问题

使用.NET向webService传double.int.DateTime 服务器得到的数据时null的问题 收藏 用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和DateTime类型的值(在服务端得到的均为null) 解决办法: VS2005封装WebService引用时,如果WebService发布的是一个基本数据类型组成的对象,则会对该对象的

C++中将string类型转换为int, float, double类型 主要通过以下几种方式:

# 方法一: 使用stringstream stringstream在int或float类型转换为string类型的方法中已经介绍过, 这里也能用作将string类型转换为常用的数值类型. Demo: [cpp] view plaincopy #include <iostream> #include <sstream>    //使用stringstream需要引入这个头文件 using namespace std; //模板函数:将string类型变量转换为常用的数值类型(此方法

c#中decimal ,double,float的区别

转自:http://www.cnblogs.com/lovewife/articles/2466543.html 单精度就是指4个字节的浮点数,即float双精度就是指8个字节的浮点数,即double decimal是高精度 浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit single-precision floating point 7 ±1.5 ×

java中Object转换成int或String类型方法

转载: http://www.cnblogs.com/1020182600HENG/p/6137206.html Object obj = getObject(); if(obj instanceof Integer) int value = (Integer)obj; 1 String转换为int类型的方法: 1. Integer.parseInt([String]) 2.Integer.valueOf([String]).intValue(); 3.Integer.decode([Strin

C++ double类型转string类型后,怎么实现小数点后只显示一个数字

C++ double类型转string类型后,怎么实现小数点后只显示一个数字 #include <iostream> #include <sstream> #include <iomanip> ?? template <class T> std::string fmt(T in, int width = 0, int prec = 0) { ????std::ostringstream s; ????s << std::setw(width) &

String类型传值以及对象传值

package Virtual; class Stan{ String mm = "hello"; } class Virtual { public static void main(String[] args) { Stan s=new Stan(); System.out.println(s.mm); change(s); System.out.println(s.mm); } public static void change(Stan s) { s.mm="say&q

asp.net MVC Model 类的主键 int类型、string类型、GUID类型。

在使用asp.net mvc进行定义 模型类的时候,一般情况下,我们都会定义一个属性为 int iD{get;set;} 或为int ClassNameID {get;set;},在这种情况下 1.Int类型主键 EF的默认约定就是第一个属性如果是类名+id或是id(这两情况下id字母大小写没有关系),并且是int类型的,那么直接设置第一个属性为主键,同时设置自增长.不需要指定[Key]关键字(在 System.ComponentModel.DataAnnotations.Schema命名空间下

将String类型的数字字符转换成int

java.lang.Integer.parseInt(String) public static int parseInt(String s) throws NumberFormatException Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may

求int型数据在内存中存储时1的个数

1.求int型数据在内存中存储时1的个数 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 我们非常easy想到例如以下方法: #include <iostream> using namespace std; int main() { int n,cnt=0; cin>>n; while(n) { if(n%2==1) cnt++; n=n/2; } cout<<cnt<<endl; return 0; } 在对代码进行測试时输入负数无法得