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>&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;
原文地址:https://www.cnblogs.com/dipwater/p/3143826.html