.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="">
<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类型属性时,服务器端接收不到数据的问题的更多相关文章
- C# 调用java的Webservice时关于非string类型处理
比如webservice地址是:http://wdft.com:80/services/getOrderService1.0?wsdl 方法是:getOrder 1.首先添加引用: 2. 3.引用完成 ...
- C++取出string的一部分以及int型转成string类型
在实际应用中,对文件的操作是十分频繁的,我们需要对文件进行拷贝,重命名等操作,这是就需要获取文件的绝对路径,一般情况下,该路径是以字符串的形式存储的,如果我们需要对文件进行重命名等,就需要对绝对路径这 ...
- 所学新知——int、char型转string 类型等
1. 利用stringstream类 定义头文件#include<sstream> 通过 int a; char b; sstream ss,ss1; ss<<a; ss1&l ...
- C++中将string类型转换为int, float, double类型 主要通过以下几种方式:
C++中将string类型转换为int, float, double类型 主要通过以下几种方式: # 方法一: 使用stringstream stringstream在int或float类型转换为 ...
- C#中decimal ,double,float的区别
浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit sin ...
- [转载] c#中decimal ,double,float的区别
一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖. 浮点型 Name CTS Type De script ion Significan ...
- c++之常见数据类型(int,double,float,long double long long 与std::string之间)相互转换(含MFC的CString、含C++11新特性函数)
--- 已经通过初步测试---- ------------------ 下面的是传统常见数据类型的转换(非c++11)--------------- std::string 与其他常用类型相互转换, ...
- String类型传值以及对象传值
package Virtual; class Stan{ String mm = "hello"; } class Virtual { public static void mai ...
- C++ double类型转string类型后,怎么实现小数点后只显示一个数字
C++ double类型转string类型后,怎么实现小数点后只显示一个数字 #include <iostream> #include <sstream> #include & ...
随机推荐
- H903
Metadata-Version: 2.0Name: hackingVersion: 0.10.2Summary: OpenStack Hacking Guideline EnforcementHom ...
- CentOS 6.5 & 7 的网络YUM源配置
中国科技大学CentOS 6.5的网络源 [base]name=CentOS-$releasever - Base#mirrorlist=http://mirrorlist.centos.org/?r ...
- 深入学习webpack(四)
更多内容可以看此文档.
- Kudu的架构
不多说,直接上干货! Kudu的架构 1.kudu的 基本框架 Kudu 是用于存储结构化( structured )的表( Table ).表有预定义的带类型的列( Columns ),每张表有一 ...
- 37、解决 HTMLTestRunner 中文显示乱码的问题
1.在自己的测试脚本中加入下面的代码并保存: # -.- coding:utf-8 -.- import sys reload(sys) sys.setdefaultencoding('utf-8') ...
- The function getUserId must be used with a prefix when a default namespace is not specified 解决办法
The function getUserId must be used with a prefix when a default namespace is not specified 解决方法: 1. ...
- 10个常见的Redis面试"刁难"问题--转
高可用架构 导读:在程序员面试过程中Redis相关的知识是常被问到的话题.作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题.十分值得一读. 作者简介:钱 ...
- Java的ThreadContext类加载器
疑惑 以前在看源码的时候,总是会遇到框架里的代码使用Thread.currentThread.getContextClassLoader()获取当前线程的Context类加载器,通过这个Context ...
- vue学习笔记 vue
目前为止对vue完全懵逼. 对着菜鸟教程,现在我尝试梳理下. 服务我已经启起来.可以看到页面 在src/App.vue里面有展示模板<template></template> ...
- node.js运行环境变量配置
-----Windows cmd---------- 1. echo %PATH% 输出Path环境变量 2.set NODE_ENV=testing 定义环境变量 3.echo %NODE_ENV ...