最近在做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="">
<xsd:annotation>
<xsd:documentation>Annual sales</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:totalDigits value=""/>
<xsd:fractionDigits value=""/>
</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

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

  1. C# 调用java的Webservice时关于非string类型处理

    比如webservice地址是:http://wdft.com:80/services/getOrderService1.0?wsdl 方法是:getOrder 1.首先添加引用: 2. 3.引用完成 ...

  2. C++取出string的一部分以及int型转成string类型

    在实际应用中,对文件的操作是十分频繁的,我们需要对文件进行拷贝,重命名等操作,这是就需要获取文件的绝对路径,一般情况下,该路径是以字符串的形式存储的,如果我们需要对文件进行重命名等,就需要对绝对路径这 ...

  3. 所学新知——int、char型转string 类型等

    1. 利用stringstream类 定义头文件#include<sstream> 通过 int a; char b; sstream ss,ss1; ss<<a; ss1&l ...

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

      C++中将string类型转换为int, float, double类型 主要通过以下几种方式: # 方法一: 使用stringstream stringstream在int或float类型转换为 ...

  5. C#中decimal ,double,float的区别

    浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit sin ...

  6. [转载] c#中decimal ,double,float的区别

    一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖. 浮点型 Name CTS Type De script ion Significan ...

  7. c++之常见数据类型(int,double,float,long double long long 与std::string之间)相互转换(含MFC的CString、含C++11新特性函数)

    --- 已经通过初步测试---- ------------------ 下面的是传统常见数据类型的转换(非c++11)---------------  std::string 与其他常用类型相互转换, ...

  8. String类型传值以及对象传值

    package Virtual; class Stan{ String mm = "hello"; } class Virtual { public static void mai ...

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

    C++ double类型转string类型后,怎么实现小数点后只显示一个数字 #include <iostream> #include <sstream> #include & ...

随机推荐

  1. OneDrive撸5T硬盘空间教程

    注意:要注册多个账户获取网盘的,用无痕模式打开临时教育邮箱网址.打开之后不要关闭,等会用来接收验证码. 1.需要office 365注册这时候需要教育邮箱: 临时教育邮箱:http://sysu.ed ...

  2. HDU 5424——Rikka with Graph II——————【哈密顿路径】

    Rikka with Graph II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  3. 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

  4. 文件夹选择之FolderBrowserDialog控件

    应用程序可能只允许用户选择文佳夹而非文件,例如在播放MP3时,用户可能把所有的MP3放在一个文佳夹内,在添加时,只要选择添加这个文佳夹,将会把在这个文件内的所有MP3添加的播放器里.在这里对播放器来说 ...

  5. webConfig中<customErrors>节点配置

    发布在远程计算机上的网站调试问题: 通常情况下我们会设置错误页,不让用户看到错误信息 这种WebConfig的配置方法是: <configuration> <system.web&g ...

  6. C++中的虚函数表

    (感谢http://blog.csdn.net/haoel/article/details/1948051/) C++中的虚函数的作用主要是实现了多态的机制. 多态,简而言之就是用父类型别的指针指向其 ...

  7. JavaScript写入文件到本地

    工作中有时需要通过 JavaScript 保存文件到本地,我们都知道 JavaScript 基于安全的考虑,是不允许直接操作本地文件的.IE 可以通过 VB 插件的方式进行,而 Chrome 和 fi ...

  8. 超链接导致window.location.href失效的解决办法

    通常我们采用 window.location.href 执行页面间的跳转,比如下面的语句 window.location.href = 'https://www.baidu.com/'; 一般执行上面 ...

  9. 编译Win32动态库工程的两个链接错误的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天编译一个Win32动态库工程,出现两个链接错误的解决,一个是: main.obj: error LNK2001: ...

  10. wechat开发笔记之1.线上环境搭建与测试

    Wechat开发笔记 线上环境搭建: 申请一个wechat公众平台. 手机个人微信可以用webwechat来测试. Website:https://web.weixin.qq.com/ 手机客户端扫一 ...