C# 将 HttpResponseMessage 反序列化为对象

标签 c# asp.net .net serialization httpresponse

我在将 HttpResponseMessage 反序列化为对象时遇到一些问题。 问题是,当对象应该反序列化时,所有字段都为空,不会抛出异常。

HttpContent content = new StringContent(xml);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml");
HttpResponseMessage response = await client.PostAsync("URL", content).ConfigureAwait(false);
// Parse response
if (response.IsSuccessStatusCode)
{
    XmlSerializer serializer = new XmlSerializer(typeof(ResponseObject));
    Stream responseStream = await response.Content.ReadAsStreamAsync();
    ResponseObject responseObject = serializer.Deserialize(responseStream) as ResponseObject;

    //Possible example of wrong data
    Console.WriteLine(responseObject.Message);
}

[XmlRoot("response")]
public class ResponseObject
{
    [XmlElement("session")]
    public string Session { get; set; }

    [XmlElement("status")]
    public string Status { get; set; }

    [XmlElement("message")]
    public string Message { get; set; }
}

字符串形式的响应消息

"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
<response>
    <val n=\"session\">SESSION ID</val>
    <val n=\"status\">201</val>
    <val n=\"message\">Created</val>
</response>"

我是不是错过了什么?我对序列化/反序列化还很陌生。 多谢指点。

最佳答案

好吧,我在评论中的 Eser 和 Biscuits 的帮助下解决了这个问题。

我试图重用代码,但并没有真正考虑到响应消息具有与早期项目不同的结构。

我将 ResponseObject 更改为:

[XmlRoot("response")]
public abstract class ResponseObject
{
    [XmlIgnore]
    public bool Success { get; set; }

    [XmlIgnore]
    public string Session
    {
        get
        {
            var result = Values.FirstOrDefault(n => n.Name == "session");
            return result.Value;
        }
    }

    [XmlIgnore]
    public string Status
    {
        get
        {
            var result = Values.FirstOrDefault(n => n.Name == "status");
            return result.Value;
        }
    }

    [XmlIgnore]
    public string Message
    {
        get
        {
            var result = Values.FirstOrDefault(n => n.Name == "message");
            return result.Value;
        }
    }

    [XmlElement("val")]
    public List<ResponseXmlWrapper<string>> Values;
}

public class ResponseXmlWrapper<T>
{
    [XmlAttribute("n")]
    [JsonProperty("n")]
    public string Name { get; set; }

    [XmlText]
    [JsonProperty()]
    public T Value { get; set; }

    public ResponseXmlWrapper()
    {

    }

    public ResponseXmlWrapper(string attributeName, T value)
    {
        Name = attributeName;
        Value = value;
    }
}

我不知道这是否是最佳解决方案,但它确实有效。

关于C# 将 HttpResponseMessage 反序列化为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32272638/

相关文章:

c# - 有什么方法可以使 ITicketStore 有范围吗?

c# - 桌面应用程序的 RavenDB session 管理

c# - Debug.Assert 是否在 Release模式下生成 IL?

c# - 在 C# 中使用 Javascript 序列化器将 DataTable 转换为嵌套 JSON

c# - 将对象设置为 null 是否确定性地处置对象?

c# - 将特殊字符(如 ' 或 +)插入 Access 数据库

asp.net - asp.net 控件之前 html 中奇怪的 ""引号

asp.net - 在 Subversion 中存储 ASP.NET 网站的最佳实践?

asp.net - AJAX 自动完成性能

c# - 如何使用虚方法显式实现接口(interface)?