项目使用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;