C,C#,WebService结构体数组返回问题--谐解
来源:互联网 发布:跟阿铭学linux 编辑:程序博客网 时间:2024/05/21 03:20
应用需求:嵌入式设备提供数据库查询结果,webservice 服务,c#平台作为客户端查询远端设备的记录,即分布式查询。
遇到问题: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
谢谢这两位博主,启发很大。
0 0
- C,C#,WebService结构体数组返回问题--谐解
- C语言结构体数组赋值问题
- C语言返回结构体
- C语言返回结构体
- C语言返回结构体
- 基于gsoap开发WebService服务返回结构体数组
- C#WebService返回dynamic类型报错问题
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- 【C语言基础】结构体数组的易错问题
- C#调用c++Dll结构体数组指针的问题
- C语言结构体中字符数组的问题
- c语言结构体数组的应用问题
- 结构体数组(C++)
- C中的数组、结构体
- C-044.结构体数组
- Linux操作系统 (RHEL 7/CentOS 7)
- 1025:To the max(DP)
- Hibernate工作原理
- 配置Android studio 项目上传jcenter 时 gradle 报以下错误
- java网络编程
- C,C#,WebService结构体数组返回问题--谐解
- linux内核启动过程追踪
- 设置隐藏Activity,避免闪烁
- ubuntu 分辨率问题and 显卡驱动安装
- 专访DeepID发明者孙祎:关于深度学习与人脸算法的深层思考
- java学习笔记(二)java继承特性总结
- Unity3D学习笔记(6)—— 飞碟射击游戏
- HDU 4337 King Arthur's Knights 【哈密顿模板题】
- 深入理解java的clone