项目使用C#开发,需要使用XmlRpc和Linux服务器端交互,用的是XmlRpc.net。

普通的程序调用入参和出差都没有问题,今天遇到入参结构体嵌套,结果 args 入参在服务器端不能解析。抓包数据如下:

<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>add</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>time</name>
<value>
<i4>1371571200</i4>
</value>
</member>
<member>
<name>args</name>
<value>
<struct>
<member>
<name>sites</name>
<value>
<i4>1</i4>
</value>
</member>
</struct>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

和服务器端同事讨论之后得知服务器端不支持结构体嵌套,需要把 args 结构体转成字符串发过去。
代码如下:

XmlRpcStruct argParam = new XmlRpcStruct();
…… // 给 argParam 赋值
XmlRpcSerializer serial = new XmlRpcSerializer(); // XmlRpc 自带的序列化类
string arg = null;
using (MemoryStream ms = new MemoryStream())
{
XmlWriter xtw = XmlWriter.Create(ms);
serial.Serialize(xtw, argParam, new MappingActions());
xtw.Flush();
xtw.Close(); arg = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
arg = arg.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
} xmlParam["args"] = arg;

经过测试服务器端可以获取到 args 入参。抓包数据如下:

<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>add</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>time</name>
<value>
<i4>1371571200</i4>
</value>
</member>
<member>
<name>args</name>
<value>&lt;value&gt;&lt;struct&gt;&lt;member&gt;&lt;name&gt;sites&lt;/name&gt;&lt;value&gt;&lt;i4&gt;1&lt;/i4&gt;&lt;/value&gt;&lt;/member&gt;&lt;/struct&gt;&lt;/value&gt;</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

补充一点:
args 参数以字符串方式赋值默认会有一个<string>……</string>标记。抓包如下:

<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>add</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>time</name>
<value>
<i4>1371571200</i4>
</value>
</member>
<member>
<name>args</name>
<value>
<string>&lt;value&gt;&lt;struct&gt;&lt;member&gt;&lt;name&gt;sites&lt;/name&gt;&lt;value&gt;&lt;i4&gt;1&lt;/i4&gt;&lt;/value&gt;&lt;/member&gt;&lt;/struct&gt;&lt;/value&gt;</string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

希望不显示<string>……</string>标记则需要设置 UseStringTag 属性为 False :

proxyClient = XmlRpcProxyGen.Create<IXmlRpcClient>();
proxyClient.UseStringTag = false;

XmlRpc.net 入参结构体嵌套的转义操作的更多相关文章

  1. C语言结构体嵌套

    #include <stdio.h> int main() { /*************************************************** *结构体嵌套:结构 ...

  2. 【C++】结构体/结构体数组/结构体指针/结构体嵌套/函数参数/const

    一.结构体声明 struct Student { //成员列表 string name; int age; int score; }; //s3;定义时直接声明 int main() { struct ...

  3. abap中结构体嵌套结构体。

    1: 结构体中嵌套结构体. *&---------------------------------------------------------------------* *& Re ...

  4. @Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...

  5. jchdl - RTL实例 - And2And(结构体嵌套的使用)

    https://mp.weixin.qq.com/s/PQIPkDymvcGc_re8ux50vA   结构体可以嵌套使用.   参考链接 https://github.com/wjcdx/jchdl ...

  6. c语言结构体3之结构体嵌套

    注意: 1结构体内部再次定义一个结构体 但是没有创建结构体的实例  也就是说再次定义的结构体内部的变量会被当做母结构体的成员变量 struct tianchao { int data; ]; stru ...

  7. C语言实现链表中结构体嵌套

    1.首先,定义两个结构体,一个用于定义链表,一个用于定义数据 // 定义数据相关的结构体 typedef struct Student{ int stu_id; ]; }Stu; // 定义链表相关的 ...

  8. Golang结构体struct的使用(结构体嵌套, 匿名结构体等)

    转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...

  9. c语言_FILE结构体解释及相关操作

    1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件 ...

随机推荐

  1. Jquery客户端校验——jquery.validate.js

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证 ...

  2. 检查日期是否为节假日api

    http://www.easybots.cn/api/holiday.php?d=20160104 返回值: 工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2: 检查一个日期是否 ...

  3. Android 常用开发工具以及Mac常用软件

    Android 常用的开发工具记录.其中包括AndroidStudio(IDEA)插件.Mac 上好用的软件以及国内知名Android开发者博客等. Android Studio 插件 codota ...

  4. ubuntu下C++连接mysql数据库

    参考了该博客的做法:http://zhmy.michael.blog.163.com/blog/static/861578792012101244715692/ 1.安装mysql: sudo apt ...

  5. JS 深浅拷贝

    首先理解概念 浅拷贝: 只复制对象的基本类型, 对象类型, 仍属于原来的引用. 深拷贝: 不紧复制对象的基本类, 同时也复制原对象中的对象.就是说完全是新对象产生的. 首先看浅拷贝 //浅拷贝 var ...

  6. 第三条:用私有构造器或者枚举类型强化Singleton属性

    1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public ...

  7. python之路十四

    概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...

  8. 【Network】修改docker启动默认网桥docker0为自定义网桥

    自定义网桥 除了默认的 docker0 网桥,用户也可以指定网桥来连接各个容器. 在启动 Docker 服务的时候,使用 -b BRIDGE或--bridge=BRIDGE 来指定使用的网桥. 如果服 ...

  9. 我的Hcharts的页面应用

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  10. 我常用的那些linux命令

    我常用的那些linux命令 用linux也有些年头了,说来也忏愧,说是有些年头了,其实也还是个不长进的主.记得第一次接触linux是boss跟我说的怎么操作,什么编辑模式,按i,a,o进入编辑模式.在 ...