首页 > 解决方案 > 格式化程序错误:Windows 更新后尝试反序列化参数时出错

问题描述

我有一个 WCF 请求,在某些 Windows 更新之前工作正常。之后我收到此错误,我无法找到解决方法。

错误是:尝试反序列化参数http://tempuri.org/:CommandRequestResult时出错。有关更多详细信息,请参阅 InnerException。

InnerException:此处不允许键入“NEntities.IPAElement,NEntities,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2132227

这里我的类 IPAElement 和里面包含的枚举。即使我用字符串更改枚举,我仍然会遇到同样的错误,所以这不应该是问题

[Serializable()]

[DataContract(IsReference = true)]

public class IPAElement//:ISerializable

{

    public IPAElement(List<string> bodyElNames, List<ElementType> bodyElTypes)

    {

        BodyElement = bodyElNames;

        BodyRowElementType = bodyElTypes;

    }



    public IPAElement()

    { }



    [DataMember]

    public List<string> HeaderElement;



    [DataMember]

    public List<string> BodyElement;



    [DataMember]

    public List<string> FooterElement;



    [DataMember]

    public List<ElementType> HeaderRowElementType;



    [DataMember]

    public List<ElementType> BodyRowElementType;

   

    [DataMember]

    public List<ElementType> FooterRowElementType;

}

[可序列化]

公共枚举元素类型

{

    [XmlEnum("1")]

    ElementName = 1,

    [XmlEnum("2")]

    Material = 2,

    [XmlEnum("3")]

    MaterialColor = 3,

    [XmlEnum("4")]

    Notes_1 = 4,

    [XmlEnum("5")]

    Notes_2 = 5,

    [XmlEnum("6")]

    Notes_3 = 6,

};

关于如何解决它的任何想法?谢谢安德里亚

标签: c#wcfserialization

解决方案


这是由 Windows 更新 KB4565633 中的安全修复程序引起的。

在检查您的用例不受安全漏洞影响后,您可能会需要这个:

AppDomain.CurrentDomain.SetData("System.Data.DataSetDefaultAllowedTypes", typeof(IPAElement));

从表面上看IPAElement,无论中间的邪恶人(或邪恶来源)在序列化内容中包含什么内容,您都不会在反序列化时导致执行任意代码,所以这种修复应该在您的特定用例中足够安全。(如果您没有提供审查,我将无法ElementType说这么多;而且我仍然只是猜测DataMemberAttribute通常情况下是这样。)

但是,您不应该相信我的话,如果您的应用程序应该关心安全性,您应该阅读漏洞并得出自己的结论,然后再决定解锁 Microsoft 选择锁定的门。


推荐阅读