なぜ一部のマシンでWCFの「フレーミングエラー」を取得しているが、他のマシンではないのはなぜですか
-
25-09-2019 - |
質問
私たちはちょうど私たちが得ていることを発見しました」フレーミングエラー」(WCFログによって報告されているように)いくつかの顧客テストマシンでシステムを実行するとき。
それはすべて、開発マシンで問題なく動作します。
すべてのサブクラスの既知のタイプの属性を備えた抽象的な基本クラスがあります。そのサブクラスの1つは、DataContract属性の欠落です。
しかし、それはすべて私たちのテストマシンで機能しました!
顧客のテストマシンでは、「フレーミングエラー」が得られました WCFログを表示すると、これはDataContract属性または既知のタイプの属性が欠落しているときに過去に見たエラーメッセージではありません。
システムをテストする前にシステムをテストする能力に自信がなくなり、マシンが顧客のマシンとしてマシンを動作させるまで、システムをテストする能力に自信がなくなりたいからです。
私が話していることを表示しようとするコード(実際のコードではありません)
[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がオンになっていると言われました 全て マシン、私はまだこれを自分のためにcomFirmしていません。
解決 2
問題は、マシンの一部が3.5を持っていなかったことだと思います。 SP1 それらの上に。
他のヒント
同様の問題がありました。ファイルは、すべてのテストマシンで適切にデータ契約を脅かしていました。ただし、1つの特定の顧客マシンでは、エラーが発生していました
クラス名 シリアル化することはできません。でマークすることを検討してください
DataContractAttribute
属性、およびあなたがシリアル化したいすべてのメンバーをマークするDataMemberAttribute
属性。
Cusotmerが.NETフレームワーク3.0を実行していたのに対し、すべてのテストは.NETフレームワーク3.5 SP1で行われていたことがわかりました。
データ契約シリアイザーの動作は、異なるACCROSS .NETフレームワーク3.0および.NETフレームワーク3.5であるようです。 3.5では、クラスがXMLシリアル化可能な場合、自動的にデータ契約もシリアル化可能です。ただし、.NETフレームワーク3.0の場合はそうではありません - クラスをで装飾する必要があります [DataContract]
また [Serializable]
.
お役に立てれば!