Почему на некоторых машинах мы видим ошибку "кадрирования" WCF, а на других нет - PullRequest
0 голосов
/ 11 мая 2010

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

2 голосов
/ 04 июня 2010

У нас была похожая проблема: файл правильно десериализовался на всех наших тестовых компьютерах.Однако на одном конкретном клиентском компьютере произошла ошибка с ошибкой

ClassName не может быть сериализовано.Подумайте о том, чтобы пометить его атрибутом DataContractAttribute и пометить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute.

Оказывается, что клиент работал .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].

Надеюсь, это поможет!

0 голосов
/ 30 сентября 2010

Мне кажется, проблема в том, что на некоторых машинах не было 3,5 SP1 .

...