XmlRpc.net 入参结构体嵌套的转义操作
项目使用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><value><struct><member><name>sites</name><value><i4>1</i4></value></member></struct></value></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><value><struct><member><name>sites</name><value><i4>1</i4></value></member></struct></value></string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
希望不显示<string>……</string>标记则需要设置 UseStringTag 属性为 False :
proxyClient = XmlRpcProxyGen.Create<IXmlRpcClient>();
proxyClient.UseStringTag = false;
XmlRpc.net 入参结构体嵌套的转义操作的更多相关文章
- C语言结构体嵌套
#include <stdio.h> int main() { /*************************************************** *结构体嵌套:结构 ...
- 【C++】结构体/结构体数组/结构体指针/结构体嵌套/函数参数/const
一.结构体声明 struct Student { //成员列表 string name; int age; int score; }; //s3;定义时直接声明 int main() { struct ...
- abap中结构体嵌套结构体。
1: 结构体中嵌套结构体. *&---------------------------------------------------------------------* *& Re ...
- @Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated
Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...
- jchdl - RTL实例 - And2And(结构体嵌套的使用)
https://mp.weixin.qq.com/s/PQIPkDymvcGc_re8ux50vA 结构体可以嵌套使用. 参考链接 https://github.com/wjcdx/jchdl ...
- c语言结构体3之结构体嵌套
注意: 1结构体内部再次定义一个结构体 但是没有创建结构体的实例 也就是说再次定义的结构体内部的变量会被当做母结构体的成员变量 struct tianchao { int data; ]; stru ...
- C语言实现链表中结构体嵌套
1.首先,定义两个结构体,一个用于定义链表,一个用于定义数据 // 定义数据相关的结构体 typedef struct Student{ int stu_id; ]; }Stu; // 定义链表相关的 ...
- Golang结构体struct的使用(结构体嵌套, 匿名结构体等)
转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...
- c语言_FILE结构体解释及相关操作
1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件 ...
随机推荐
- Android:控件AutoCompleteTextView 自动提示
在文本框中输入,要这样的提示效果,如果你输入的是aac,在输入aa后,选择aac,文本框的内容会自动补齐,输入aac(类似百度搜索文本框的显示结果) <AutoCompleteTextVie ...
- 收藏的Android学习资源
1. Android中混合开发系列 Android中Java与JavaScript的交互,可用来实现网页与本地APP的交互,信息的传递等: 谈谈App的混合开发,可以让一部分功能由html5开发,这部 ...
- javaScript数据类型及判断
ECMAScript数据类型概念: ECMAScript数据类型分为两类:原始类型和对象类型(即基本类型和引用类型): ECMAScript数据类型也可以分为可变类型和不可变类型,数组和对象属于可变类 ...
- css3伪类、伪元素选择器---nth-child()和nth-of-type()选择器的区别
p:nth-child(2) 要满足两个条件,1:选择的是p元素的父元素的第二个子元素 2:选择的第二个子元素必须是p元素,如果不满足,则将不显示 p:nth-of-type(2) 选择父元素下的 ...
- day21
1.文件上传 a. Html Form表单提交 b. Ajax提交 原生XMLHttpRequest XmlHttpReqeust() 类 ...
- Google Code Jam 2016 Round 1B B
题意:给出两个数字位数相同,分别中间有若干位不知道,用问号表示.现在要求补全这两个数字,使得差值的绝对值最小,多解则取第一个数字的值最小的,再多解就取第二个数字最小的. 分析: 类似数位dp,但是很多 ...
- 【原创】node+express+socket搭建一个实时推送应用
技术背景 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新. 应用场景: 监控系统:后台硬件热插拔.LED.温度.电压发生变化 即 ...
- 有人要分享pjax吗?
安装 1.在 composer.json 的 require里 加入 "yuanchao/pjax-for-laravel-5": "dev-master" 2 ...
- Visual Studio将std::cout输出到Output窗口
在debug的时候,输出到Output需要使用OutputDebugString函数,但部分库的log是采用std::cout输出的,需要用控制台(黑窗)程序来查看输出.有没有一种使用GUI和Outp ...
- Ajax请求跨域问题 -- 转载
几乎每种浏览器都存在默认的安全机制,都有同源策略,因为浏览器恶意的把每个外部请求的都当做是黑客攻击,相当于是对自身的保护,所以浏览器在运行脚本时会判断脚本与请求的页面是否是同一来源,这个同一来源,包括 ...