Мы только что обнаружили, что получаем « ошибки кадрирования » (как сообщается в журналах 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 на всех машинах, я еще не подтвердил это для себя.