C,C#,WebService结构体数组返回问题--谐解
2016-04-03 19:06
507 查看
应用需求:嵌入式设备提供数据库查询结果,webservice 服务,c#平台作为客户端查询远端设备的记录,即分布式查询。
遇到问题:1.基于gsoap的基本webservice开发就不废话了,网上一大堆。痛点,查询多条记录结果返回给c#。c#客户端无法解析xml转换成数组。
2.多个二进制数据同时返回给c#。
先说我的解决方法:1. 查询结果,转换成json串,用string 类型返回(高手提醒)。c端,采用cJson库解析创建json串(简单)。
2. 手动写wsdl 分别生成从,c, c#端代码。(自动生成c#代码,自动分解c#返回值)
WSDL文件:
详细说明一下 c#生成的接口,天生的支持数组,
返回json数据
返回多个二进制数据组
//自动把返回的结构体分解成多个输出,自动关联xml解析类型。如果使用c# 自动生成接口简单的多(但无法解决数据的问题)
c端的接口很正常,没什么问题
我把代码代码打包上传到 路径:http://download.csdn.net/detail/zhujinghao09/9480345
为了解决这个问题,废了九牛二虎之力,如果有简单的方法,欢迎分享。
参考链接:http://www.cnblogs.com/linyc/archive/2011/12/20/2295040.html
http://my.oschina.net/jacobin/blog/143452?fromerr=R7swAZoN
谢谢这两位博主,启发很大。
遇到问题:1.基于gsoap的基本webservice开发就不废话了,网上一大堆。痛点,查询多条记录结果返回给c#。c#客户端无法解析xml转换成数组。
2.多个二进制数据同时返回给c#。
先说我的解决方法:1. 查询结果,转换成json串,用string 类型返回(高手提醒)。c端,采用cJson库解析创建json串(简单)。
2. 手动写wsdl 分别生成从,c, c#端代码。(自动生成c#代码,自动分解c#返回值)
WSDL文件:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.jshwx.com/sbox/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SboxRecordServer" targetNamespace="http://www.jshwx.com/sbox/"> <types> <xsd:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.jshwx.com/sbox/" targetNamespace="http://www.jshwx.com/sbox/" version="1.0"> <!--卡口索引查询接口参数--> <xsd:element name="kkQueryRecordIdxReq" type="tns:kkQueryRecordIdxReq"/> <xsd:element name="kkQueryRecordIdxRsp" type="tns:kkQueryRecordIdxRsp"/> <xsd:complexType name="kkQueryRecordIdxReq"> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" name="startTime" type="xsd:string" /> <xsd:element minOccurs="0" maxOccurs="1" name="endTime" type="xsd:string" /> <xsd:element minOccurs="1" maxOccurs="1" name="chId" type="xsd:int" /> <xsd:element minOccurs="0" maxOccurs="1" name="plateNum" type="xsd:string" /> <xsd:element minOccurs="1" maxOccurs="1" name="maxResultNum" type="xsd:int" /> <xsd:element minOccurs="1" maxOccurs="1" name="timeOut" type="xsd:int" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="kkQueryRecordIdxRsp" > <xsd:sequence> <xsd:element minOccurs="1" maxOccurs="1" name="kkQueryRecordResult" type="xsd:int" /> <xsd:element minOccurs="1" maxOccurs="1" name="recordNum" type="xsd:int" /> <xsd:element minOccurs="0" maxOccurs="1" name="recordIdxJson" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <!--卡口数据获取接口参数--> <xsd:element name="kkGetRecordDataReq" type="tns:kkGetRecordDataReq"/> <xsd:element name="kkGetRecordDataRsp" type="tns:kkGetRecordDataRsp"/> <xsd:complexType name="kkGetRecordDataReq"> <xsd:sequence> <xsd:element minOccurs="0" name="recordId" type="xs:int" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="kkGetRecordDataRsp"> <xsd:sequence> <xsd:element minOccurs="1" maxOccurs="1" name="kkGetRecordDataResult" type="xsd:int" /> <xsd:element minOccurs="0" name="recordName" type="xs:string" /> <xsd:element minOccurs="0" name="idxFile" nillable="true" type="xs:base64Binary" /> <xsd:element minOccurs="0" name="jpgFile" nillable="true" type="xs:base64Binary" /> </xsd:sequence> </xsd:complexType> </xsd:schema> </types> <!--卡口索引查询接口参数--> <message name="kkQueryRecordIdxReq"> <part element="tns:kkQueryRecordIdxReq" name="parameters" /> </message> <message name="kkQueryRecordIdxRsp"> <part element="tns:kkQueryRecordIdxRsp" name="parameters" /> </message> <!--卡口数据获取接口参数--> <message name="kkGetRecordDataReq"> <part element="tns:kkGetRecordDataReq" name="parameters" /> </message> <message name="kkGetRecordDataRsp"> <part element="tns:kkGetRecordDataRsp" name="parameters" /> </message> <!--端口--> <portType name="SboxRecordServerDelegate"> <operation name="kkQueryRecordIdx"> <input message="tns:kkQueryRecordIdxReq" /> <output message="tns:kkQueryRecordIdxRsp" /> </operation> <operation name="kkGetRecordData"> <input message="tns:kkGetRecordDataReq" /> <output message="tns:kkGetRecordDataRsp" /> </operation> </portType> <!--绑定接口--> <binding name="SboxRecordServerBinding" type="tns:SboxRecordServerDelegate"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="kkQueryRecordIdx"> <soap:operation soapAction="" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> <operation name="kkGetRecordData"> <soap:operation soapAction="" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> <!--声明服务--> <service name="SboxRecordServer"> <port binding="tns:SboxRecordServerBinding" name="SboxRecordServer"> <soap:address location="http://localhost:8080/" /> </port> </service> </definitions>
详细说明一下 c#生成的接口,天生的支持数组,
返回json数据
public int kkQueryRecordIdx(<span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] string startTime,</span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] string endTime, </span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] int chId,</span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] string plateNum,</span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] int maxResultNum,</span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] int timeOut,</span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out int recordNum, </span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out string recordIdxJson) {</span>
object[] results = this.Invoke("kkQueryRecordIdx", new object[] { startTime, endTime, chId, plateNum, maxResultNum, timeOut}); recordNum = ((int)(results[1])); recordIdxJson = ((string)(results[2])); return ((int)(results[0])); }
返回多个二进制数据组
//自动把返回的结构体分解成多个输出,自动关联xml解析类型。如果使用c# 自动生成接口简单的多(但无法解决数据的问题)
public int kkGetRecordData(<span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] int recordId,</span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] [System.Xml.Serialization.XmlIgnoreAttribute()] bool recordIdSpecified,</span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out string recordName,</span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="base64Binary", IsNullable=true)] out byte[] idxFile,</span><span style="font-family: Arial, Helvetica, sans-serif;">[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="base64Binary", IsNullable=true)] out byte[] jpgFile) </span><span style="font-family: Arial, Helvetica, sans-serif;">{</span>
object[] results = this.Invoke("kkGetRecordData", new object[] { recordId, recordIdSpecified}); recordName = ((string)(results[1])); idxFile = ((byte[])(results[2])); jpgFile = ((byte[])(results[3])); return ((int)(results[0])); }
下面是C#自己生成wsdl和接口代码,c#高手可以看看为啥他们不同,帮我解释一下(我不会c#)<span style="font-family: Arial, Helvetica, sans-serif;">//没有把返回结构分解</span>
public int kkQueryRecord(kkQueryRecordReq req, out kkQueryRecordRsp rsp) { object[] results = this.Invoke("kkQueryRecord", new object[] { req}); rsp = ((kkQueryRecordRsp)(results[1])); return ((int)(results[0])); }
c端的接口很正常,没什么问题
我把代码代码打包上传到 路径:http://download.csdn.net/detail/zhujinghao09/9480345
为了解决这个问题,废了九牛二虎之力,如果有简单的方法,欢迎分享。
参考链接:http://www.cnblogs.com/linyc/archive/2011/12/20/2295040.html
http://my.oschina.net/jacobin/blog/143452?fromerr=R7swAZoN
谢谢这两位博主,启发很大。
相关文章推荐
- 各种颜色RGB值【附c#中获取颜色的argb值】
- c#中获取颜色的argb值
- C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件(图解)
- C#数组复制操作
- C#实现把指定文件夹下的所有文件复制到指定路径下以及修改指定文件的后缀名
- C# : 读取XML文件 (二)
- Notepad++简单配置c#开发
- LeetCode #1 Two Sum C# Solution
- C# : 读取XML文件 (一)
- C# : 读取简单的XML文件
- C# TextBox常用方法总结
- C#、.Net代码精简优化(空操作符(??)、as、string.IsNullOrEmpty() 、 string.IsNullOrWhiteSpace()、string.Equals()、System.IO.Path 的用法)
- BC#78 (div.2)CA Loves GCD【N个数gcd】
- BC#78 (div.2) 1001 CA Loves Stick 【注意取值范围】
- C#中泛型容器Stack<T>
- C#套接字和windowsAPI套接字
- C#套接字和windowsAPI套接字
- C# LDAP 管理(创建新用户)
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
- C#-变量类型(值类型、引用类型)