为什么我们在某些机器上获得WCF“框架错误”而不是其他机器

时间:2010-05-11 09:38:15

标签: .net wcf datacontract known-types

我们刚刚发现在某个客户测试计算机上运行我们的系统时,我们收到了“框架错误”(由WCF日志报告)。

在我们的开发机器上一切正常。

我们有一个抽象基类,其所有子类都有KnownType属性。其中一个子类缺少它的DataContract属性。

然而,这一切都适用于我们的测试机器!

在客户测试计算机上,我们出现了“框架错误”,显示了WCF日志,这不是我在过去丢失DataContract属性或KnownType属性时看到的错误消息

  

我希望深究这一点,   因为我们再也没有信心了   我们之前测试系统的能力   直到我们可以把它交给客户   让我们的机器表现得像   客户的机器。


试图展示我所说的内容的代码(不是真正的代码)

    [DataContract()]
    [KnownType(typeof(SubClass1))]
    [KnownType(typeof(SubClass2))] 
    // other subclasses with data members
    public abstract class Base
    {
        [DataMember]
        public int LotsMoreItemsThenThisInRealLife;
    }

    /// <summary>
    /// This works on some machines (not not others) when passed to Contract::DoIt, 
    /// note the missing [DataContract()]
    /// </summary>
    public class SubClass1 : Base
    {
        // has no data members
    }

    /// <summary>
    /// This works in all cases when passed to Contract::DoIt
    /// </summary>
    [DataContract()]
    public class SubClass2 : Base
    {
        // has no data members
    }

    public interface IContract
    {
        void DoIt(Base[] items);
    }

    public static class MyProgram
    {
        public static IContract ConntectToServerOverWCF()
        {
            // lots of code ...
            return null;
        }

        public static void Startup()
        {
            IContract server = ConntectToServerOverWCF();

            // this works all of the time
            server.DoIt(new Base[]{new SubClass2(){LotsMoreItemsThenThisInRealLife=2}});

            // this works "in develperment" e.g. on our machines, but not on the customer's test machines! 
            server.DoIt(new Base[] { new SubClass1() { LotsMoreItemsThenThisInRealLife = 2 } });
        }
    }

更新我被告知.net 3.5 SP1在所有机器上,我还没有为自己确认这个。

2 个答案:

答案 0 :(得分:2)

我们遇到了类似的问题:文件在我们所有的测试机器上进行了正确的数据协定反序列化。但是,在一台特定的客户计算机上,它失败并显示错误

  

ClassName 无法序列化。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。

原来,cusotmer运行的是.NET Framework 3.0,而我们所有的测试都是在.NET Framework 3.5 SP1上完成的。

似乎数据协定序列化程序的行为在.NET Framework 3.0和.NET Framework 3.5中是不同的。在3.5,如果一个类是XML可序列化的,那么它也是自动数据协定可序列化的。但是,.NET Framework 3.0不是这种情况 - 该类必须使用[DataContract][Serializable]进行修饰。

希望这有帮助!

答案 1 :(得分:0)

我认为问题是某些机器上没有3.5 SP1