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