Наконец-то я решил проблему, переключившись на стандартный XmlSerializer.
[XmlRoot("methodCall")]
public class XmlRequest
{
[XmlElement(ElementName = "methodName")]
public string MethodName { get; set; }
[XmlArray(ElementName = "params")]
[XmlArrayItem("param")]
public List <RequestParam> ListParams { get; set; }
public string ToXML()
{
using (var stringwriter = new System.IO.StringWriter())
{
using (var xmlwriter = XmlWriter.Create(stringwriter, new XmlWriterSettings { OmitXmlDeclaration = true }))
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", "");
new XmlSerializer(this.GetType()).Serialize(xmlwriter, this, ns);
}
return stringwriter.ToString();
}
}
}
Я называю это так:
List<RequestParam> listParams = new List<RequestParam>()
{
new RequestParam("user"),
new RequestParam("password"),
new RequestParam(true),
new RequestParam(123)
};
request.Parameters.Clear();
XmlRequest reqObject = new XmlRequest
{
MethodName = "api.Testcall",
ListParams = listParams
};
string rawXml = reqObject.ToXML();
request.AddParameter("application/xml", rawXml, ParameterType.RequestBody);
Обратите внимание, что я сейчас использую request.AddParameter запроса. AddBody, который я использовал раньше. Так что у меня больше контроля над созданием строки стандартным XmlSerializer. OmitXmlDeclaration подавляет кодировку и стандартный запуск xml -Document. Изменились и мои классы:
public class RequestParam
{
[XmlElement(ElementName = "value")]
public Alterable Value { get; set; }
public RequestParam() { }
public RequestParam(int number)
{
Value = new Alterable(number);
}
public RequestParam(String str)
{
Value = new Alterable(str);
}
public RequestParam(Boolean boo)
{
Value = new Alterable(boo);
}
}
public class Alterable
{
[XmlElement(DataType = "string",Type = typeof(string)),
XmlElement(DataType = "int",Type = typeof(int)),
XmlElement(DataType = "boolean",Type = typeof(Boolean))]
public object Changeable { get; set; }
public Alterable() { }
public Alterable(int number)
{
Changeable = number;
}
public Alterable(string str)
{
Changeable = str;
}
public Alterable(Boolean boo)
{
Changeable = boo;
}
}
Мой класс Alterable может принимать строки, целые и логические значения и корректно печатать их в XML. Надеюсь, что это помогает кому-то, имеющему те же проблемы.
Результат:
<methodCall>
<methodName>api.Testcall</methodName>
<params>
<param>
<value>
<string>user</string>
</value>
</param>
<param>
<value>
<string>password</string>
</value>
</param>
<param>
<value>
<boolean>true</boolean>
</value>
</param>
<param>
<value>
<int>123</int>
</value>
</param>
</params>
</methodCall>