Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么我们会得到一个WCF;“帧错误”;在一些机器上,而不是在其他机器上_.net_Wcf_Datacontract_Known Types - Fatal编程技术网

.net 为什么我们会得到一个WCF;“帧错误”;在一些机器上,而不是在其他机器上

.net 为什么我们会得到一个WCF;“帧错误”;在一些机器上,而不是在其他机器上,.net,wcf,datacontract,known-types,.net,Wcf,Datacontract,Known Types,我们刚刚发现,在一些客户测试机器上运行系统时,会出现“帧错误”(正如WCF日志所报告的) 在我们的开发机器上一切正常 我们有一个抽象基类,它的所有子类都有KnownType属性。它的一个子类缺少DataContract属性 然而,这一切都在我们的测试机器上运行 在客户的测试机器上,我们得到了“framing error”显示WCF日志,这不是我过去看到的缺少DataContract属性或KnownType属性的错误消息 我想弄清这件事的真相, 因为我们不再有信心 我们以前测试系统的能力 在我们能

我们刚刚发现,在一些客户测试机器上运行系统时,会出现“帧错误”(正如WCF日志所报告的)

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

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

然而,这一切都在我们的测试机器上运行

在客户的测试机器上,我们得到了“framing error”显示WCF日志,这不是我过去看到的缺少DataContract属性或KnownType属性的错误消息

我想弄清这件事的真相, 因为我们不再有信心 我们以前测试系统的能力 在我们能够完成之前,将其交给客户 让我们的机器像其他机器一样工作 客户的机器


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

[DataContract()]
[知识类型(类型)(子类1))]
[知识类型(类型)(第2子类))]
//具有数据成员的其他子类
公共抽象类基
{
[数据成员]
公共场所的公共场所;
}
/// 
///当传递给Contract::DoIt时,它在某些机器(不是其他机器)上工作,
///请注意缺少的[DataContract()]
/// 
公共类子类1:基
{
//没有数据成员
}
/// 
///当传递给Contract::DoIt时,这在所有情况下都有效
/// 
[DataContract()]
公共类子类2:基
{
//没有数据成员
}
公共接口IContract
{
作废DoIt(基本[]项);
}
公共静态类程序
{
公共静态IContract contectToServerOvervcf()
{
//很多代码。。。
返回null;
}
公共静态无效启动()
{
IContract服务器=conntectToServerOvervcf();
//这种方法一直有效
DoIt(new Base[]{new subclass 2(){lotsmoreitemsthenthisinrellife=2}});
//这在“开发中”起作用,例如在我们的机器上,但在客户的测试机器上不起作用!
DoIt(new Base[]{new subclass 1(){lotsmoreitemsthenthisinrellife=2}});
}
}


更新我被告知.net 3.5 SP1在所有的机器上,我还没有确认这一点。

我们有一个类似的问题:一个文件在我们所有的测试机器上正确地反序列化数据契约。然而,在一台特定的客户机器上,它失败了,出现了错误

无法序列化类名。考虑用<代码> DATACONTractAtgult< /代码>属性对其进行标记,并标记您希望使用“代码>数据DATAMEMBARECTION< /COD>属性>序列化的所有成员。< /P> 事实证明,cusotmer运行的是.NETFramework3.0,而我们所有的测试都是在.NETFramework3.5SP1上完成的

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


希望这有帮助

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

    [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 } });
        }
    }