Почему мы получаем WCF «Ошибка обрамления» на некоторых машинах, но не других

StackOverflow https://stackoverflow.com/questions/2809519

Вопрос

Мы только что нашли, что мы получаем »Обрамление ошибок«(Как сообщает журналы WCF) при запуске нашей системы на какой-то компьютерной машине.

Все работает нормально на наших машинах развития.

У нас есть абстрактный базовый класс, с известными атрибутами для всех его подкладок. Один из него подкласса отсутствует, это атрибут DataContract.

Однако все это работало на нашей тестовой машине!

На тестовой машине клиентов мы получили «Ошибка обрамления» Показываю журналы WCF, это не сообщение об ошибке, которое я видел в прошлом, когда отсутствует атрибут DataContract или AttributeyPeyPe.

Я хочу добраться до этого, так как мы больше не можем иметь уверенность в нашей способности протестировать систему, прежде чем давать его заказчику, пока мы не сможем сделать наши машины, которые будут вести себя как машины клиента.


Код, который пытается показать, о чем я говорю, (не реальный код)

    [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

Я считаю, что проблема в том, что часть машины не было 3,5 SP1. на них.

Другие советы

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

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

Оказывается, что CUSOTMER работал .NET Framework 3.0, тогда как все наши тестирования было сделано на .NET Framework 3.5 SP1.

Похоже, что поведение договора данных Serializer является отличным Accross .NET Framework 3.0 и .NET Framework 3.5. На 3.5, если класс является XML Serializable, то он автоматически содержит контракт на сериализен. Однако это не так с .NET Framework 3.0 - класс должен быть украшен [DataContract] или [Serializable].

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top