项目使用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. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  2. ASP.NET、JAVA跨服务器远程上传文件(图片)的相关解决方案整合

    一.图片提交例: A端--提交图片 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string u ...

  3. linux 安装nexus

    1.下载nexus 的包,加压缩. 2.启动neuxs export RUN_AS_USER=root     ./nexus start

  4. 关于SQL语句查询区分大小写

    在需要区分大小的字段后添加:collate Chinese_PRC_CS|CI_AS|AI  CI表示:不区分大小写 CS表示:区分大小写 AI表示: 指定不区分重音 AS表示:指定区分重音. 例:查 ...

  5. Git的checkout, reset, revert

    不管是修改还是新建文件,都必须通过git add把这次修改从工作区加到暂存区: commit只是提交暂存区的修改,还没add到暂存区处于工作区的修改是不会commit的:   git checkout ...

  6. 2016 Google code jam 答案

    二,RoundC import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundE ...

  7. python之路十九

    1.Django请求生命周期        -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串        -> URL对应关系(匹配) -> 视图函数 ...

  8. html5——canva 绘图1简单图形

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 在CentOS下搭建自己的Git服务器

    首先需要装好CentOS系统,作为测试,你可以选择装在虚拟机上,这样比较方便.这步默认你会,就不讲了.有了CentOS,那么如何搭建Git服务器呢?1.首先需要安装Git,可以使用yum源在线安装: ...

  10. 设计模式--原型模式Prototype(创建型)

    一.原型模式 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式实现的关键就是实现Clone函数,还需要实现深拷贝. 二.UML类图 三.例子 //父类 class Resume ...