【问题标题】:HttpClient does not serialize XML correctlyHttpClient 未正确序列化 XML
【发布时间】:2014-08-25 19:46:36
【问题描述】:

调用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())

【问题讨论】:

  • 您是否从 2014 年 8 月 11 日或类似日期再次发布了相同的问题? stackoverflow.com/questions/25251240/…
  • 你还知道调用client.PostAsXMLAsync时的url是什么吗?如果是这样,只需将 url 替换为实际的 http url 并尝试这种方式..
  • 不同的问题 - 我现在正在使用基于属性的序列化。使用正确的 url 时出现同样的错误
  • 可以添加PostAsXmlAsync生成的XML吗?
  • 看起来你缺少一些东西试试这个链接,它似乎更符合我认为你正在尝试做的事情。msdn.microsoft.com/en-us/library/…

标签: c# .net task-parallel-library async-await dotnet-httpclient


【解决方案1】:

查看source code of PostAsXmlAsync,我们可以看到它使用XmlMediaTypeFormatter,内部使用DataContractSerializer不是 XmlSerializer。前者不尊重XmlRootAttribute

public static Task<HttpResponseMessage> PostAsXmlAsync<T>(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<HttpResponseMessage> PostAsXmlWithSerializerAsync<T>(this HttpClient client, Uri requestUri, T value, CancellationToken cancellationToken)
    {
        return client.PostAsync(requestUri, value,
                      new XmlMediaTypeFormatter { UseXmlSerializer = true },
                      cancellationToken);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多