HttpClient不能正确序列化XML
在调用HttpClient的扩展方法PostAsXmlAsync
,它会忽略该类的XmlRootAttribute
。 这种行为是个错误吗?
测试
[Serializable] [XmlRoot("record")] class Account { [XmlElement("account-id")] public int ID { get; set } } var client = new HttpClient(); await client.PostAsXmlAsync(url, new Account())
查看PostAsXmlAsync
的源代码 ,我们可以看到它使用XmlMediaTypeFormatter
,它在内部使用DataContractSerializer
而不是 XmlSerializer
。 前者不尊重XmlRootAttribute
:
public static Task PostAsXmlAsync(this HttpClient client, Uri requestUri, T value, CancellationToken cancellationToken) { return client.PostAsync(requestUri, value, new XmlMediaTypeFormatter(), cancellationToken); }
为了实现您的需要,您可以创建自己的自定义扩展方法,该方法明确指定使用XmlSerializer
:
public static class HttpExtensions { public static Task PostAsXmlWithSerializerAsync(this HttpClient client, Uri requestUri, T value, CancellationToken cancellationToken) { return client.PostAsync(requestUri, value, new XmlMediaTypeFormatter { UseXmlSerializer = true }, cancellationToken); } }