C#中无法将HttpResponseMessage的XML响应反序列化为对象
AWS STS AssumeRole XML反序列化修复方案
你遇到的问题主要出在两个核心点:XML命名空间未匹配,以及实体类的属性标记错误,同时还遗漏了部分字段。
问题1:XML命名空间未处理
原XML根节点带有命名空间xmlns="https://sts.amazonaws.com/doc/2011-06-15/",但你的实体类没有指定对应命名空间,导致XmlSerializer无法匹配节点,直接抛出反序列化错误。
问题2:Credentials类的标记错误与字段遗漏
- XML里的
AccessKeyId、SecretAccessKey等是子元素,但你代码里用了[XmlAttribute]标记,这会让序列化器去寻找节点的属性而非子元素,所以属性值始终为空。 - 类名
Credentialss多了一个冗余的s,建议改成Credentials贴合XML节点名,同时还遗漏了SessionToken和Expiration两个必要字段。
修正后的实体类代码
namespace TestHarness { [XmlRoot(ElementName = "AssumeRoleResponse", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public class AssumeRoleResponse { [XmlElement(ElementName = "AssumeRoleResult", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public AssumeRoleResult AssumeRoleResult { get; set; } [XmlElement(ElementName = "ResponseMetadata", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public ResponseMetadata ResponseMetadata { get; set; } } public class AssumeRoleResult { [XmlElement(ElementName = "AssumedRoleUser", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public AssumedRoleUser AssumedRoleUser { get; set; } [XmlElement(ElementName = "Credentials", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public Credentials Credentials { get; set; } } public class AssumedRoleUser { [XmlElement(ElementName = "AssumedRoleId", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public string AssumedRoleId { get; set; } [XmlElement(ElementName = "Arn", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public string Arn { get; set; } } public class Credentials { [XmlElement(ElementName = "AccessKeyId", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public string AccessKeyId { get; set; } [XmlElement(ElementName = "SecretAccessKey", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public string SecretAccessKey { get; set; } [XmlElement(ElementName = "SessionToken", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public string SessionToken { get; set; } [XmlElement(ElementName = "Expiration", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public DateTime Expiration { get; set; } } public class ResponseMetadata { [XmlElement(ElementName = "RequestId", Namespace = "https://sts.amazonaws.com/doc/2011-06-15/")] public string RequestId { get; set; } } }
反序列化代码说明
你的原反序列化代码无需改动,只要实体类修正后,就能正确处理带命名空间的XML响应,无需手动移除xmlns属性。
内容的提问来源于stack exchange,提问作者Fazla Elahi Md Jubayer
相关产品推荐
相关产品推荐

