WCF 错误:期待状态“元素”。遇到名称为“文本”、名称空间“”的 XML 格式的 post call

Posted

技术标签:

【中文标题】WCF 错误:期待状态“元素”。遇到名称为“文本”、名称空间“”的 XML 格式的 post call【英文标题】:WCF error: Expecting state 'Element'.. Encountered 'Text' with name '', namespace '' post call in XML format 【发布时间】:2021-06-30 03:21:09 【问题描述】:

我有一个 WCF 服务方法,它不能反序列化 XML 格式的帖子,并且会出错

第 14 行第 30 位出错。预期状态为“元素”。遇到 'Text' 名称为 '',命名空间 ''

我缩小到特定部分,例如下面的可重现示例

var xmlSrc = @"<Keys>
                  <ProductKeyID>123</ProductKeyID>
                  <ProductKeyID>124</ProductKeyID>
                  <ProductKeyID>125</ProductKeyID>
               </Keys>";
DataContractSerializer serializer = new DataContractSerializer(typeof(Keys));
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xmlSrc)))


    var i = (Keys)serializer.ReadObject(stream);


[DataContract(Namespace = "")]
[Serializable]
public class Keys

    [DataMember(Order = 1)]
    public List<string> ProductKeyID  get; set; 

如何调整 C# 类以正确反序列化 XML?

我确实搜索过帖子是否存在,但其中大多数是 json 格式,似乎对我的情况没有帮助。

【问题讨论】:

相关或重复:Data Contract Serializer - How to omit the outer element of a collection. 【参考方案1】:

作为替代方案,您可以使用CollectionDataContract 属性。您的类Keys 将继承自List。在CollectionDataContract 属性中指定根元素的名称和项的名称。

[CollectionDataContract(Name = "Keys", ItemName = "ProductKeyID", Namespace ="")]
public class Keys<T> : List<T>



DataContractSerializer serializer = new DataContractSerializer(typeof(Keys<string>));
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xmlSrc)))

    var i = (Keys<string>)serializer.ReadObject(stream);

【讨论】:

以上是关于WCF 错误:期待状态“元素”。遇到名称为“文本”、名称空间“”的 XML 格式的 post call的主要内容,如果未能解决你的问题,请参考以下文章

WCF Web 服务无法访问 Web Config 中的服务名称

WCF 休息 - 没有找到元素错误

WCF 请求失败,HTTP 状态为 405:不允许方法

在 UIAutomation 中从 UIAElementArray 中按名称获取元素时遇到问题

WCF 错误 - 安全处理器无法在消息中找到安全标头

语法错误,意外的 ',',期待 ')' 在纤细的导轨中