You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#构建XML-RPC请求时复杂结构体与数组的构造问题及解决方法

C#构建XML-RPC请求时复杂结构体与数组的构造问题及解决方法

最近帮朋友排查过类似的XML-RPC参数构造问题,看到你踩的坑特别熟悉,结合你提供的尝试过程和最终找到的解决方案,整理一下具体的问题原因和正确处理方式:

问题场景

你需要调用XML-RPC接口update_plan_prices,其中第五个参数要求是一个带成员的struct结构:成员的name是房间ID,对应的值是一个包含价格数据的数组。你尝试了两种构造方式都报错:

  • 第一种用匿名对象数组:返回「no prices found」,说明接口没正确识别到价格数据,参数结构不符合预期
  • 第二种用匿名对象:返回「Tried to change more than 1000 nights」,说明参数被解析成了错误格式,导致天数计算异常

问题根源

XML-RPC的struct和array是专用类型,普通C#匿名对象/数组没法被XML-RPC代理正确序列化为目标XML结构,自然会被接口拒绝或者解析出错。

正确解决方案

要使用XML-RPC库提供的XmlRpcStruct类型来构建参数,才能生成符合接口要求的XML:

  1. 调整方法定义
    先把update_plan_prices方法的最后一个参数类型改为XmlRpcStruct,确保代理能正确识别并序列化这个类型:

    Object[] update_plan_prices(string token, string lcode, int pid, string dfrom, XmlRpcStruct prices);
    
  2. 构造正确的参数结构
    用XmlRpcStruct来构建包含房间ID和对应价格数组的结构体,键是房间ID(字符串类型),值是价格数据数组:

    // 初始化XmlRpcStruct对象
    XmlRpcStruct pricesObj = new XmlRpcStruct();
    // 添加房间ID与对应的价格数组(示例中房间ID为"559769",价格为201)
    pricesObj.Add("559769", new object[] { 201 });
    
  3. 发起请求
    用构造好的pricesObj作为参数调用接口,此时生成的XML会和接口要求的结构完全匹配:

    FlRPC proxy = XmlRpcProxyGen.Create<FlRPC>();
    var responses = proxy.update_plan_prices("RandToken", "1234234", 0, "10/10/2017", pricesObj);
    

验证生成的XML结构

这样构造后,生成的第五个参数XML会和接口要求的完全一致:

<param>
  <value>
    <struct>
      <member>
        <name>559769</name>
        <value>
          <array>
            <data>
              <value>
                <int>201</int>
              </value>
            </data>
          </array>
        </value>
      </member>
    </struct>
  </value>
</param>

这个结构能被接口正确解析,不会再出现之前的错误。

备注:内容来源于stack exchange,提问作者pleasehelpstackover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 15:34:06