Ошибка сбора сериализации операции WCF - PullRequest
2 голосов
/ 10 марта 2011

Я возвращаю коллекцию объектов DTO из операции WCF.

Я получаю следующую ошибку на сервисе (это происходит только изредка)

Ошибка: коллекция была изменена; операция перечисления может не выполняться.

Трассировка стека:

at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
at WriteArrayOfDeviceDTOToXml(XmlWriterDelegator , Object ,    XmlObjectSerializerWriteContext , CollectionDataContract )
at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator    xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)at   System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)at WritePositionServerStatisticsDTOToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract )

Код операции:

    public List<PositionServerDTO> GetPositionServers()
    {
        try
        {
            List<PositionServerDTO> list = new List<PositionServerDTO>();
            foreach (PositionServer posServer in dataStore.PositionServerList.ToList())
            {
                posServer.Statistics.CompileStatistics();
                list.Add(Mapper.Map<PositionServer, PositionServerDTO>(posServer));
            }
            return list;
        }
        catch (Exception ex)
        {
            dataStore.Log.Error("There was an error returning all Position Servers", ex);
            CustomException customerEx = new CustomException("There was an error returning all the Position Servers", 170, ex.Message, ex, "Position Service" , AMSLog.AlphaPositionService);
            throw new FaultException<CustomException>(customerEx, new FaultReason(customerEx.ErrorMessage), new FaultCode("170"));
        }
    }

Странная вещь - похоже, что ошибка возникает во время сериализации коллекции объектов DTO, а не в самом теле операции. Я знаю это, потому что исключение не зарегистрировано как задокументировано в операторе catch.

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

У кого-нибудь есть идеи, что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 14 марта 2011

У меня такая же проблема.

WCF автоматически генерирует этот код сериализации для вас, используя ваши имена объектов с помощью отражения.

Я изучаю решение, мой следующий шаг - внедрить суррогат контракта для выполнения ToList () в моем списке кэша, переписав это свойство перед передачей в сериализацию без кэша изменений

Надеюсь, это поможет вам, если у вас есть лучшее решение, пожалуйста, опубликуйте его.

С уважением,

Jefferson

0 голосов
/ 10 марта 2011

ОК, вот ваша проблема:

Вы реализуете свою собственную XMlSerialization (поскольку я вижу WriteArrayOfDeviceDTOToXml в трассировке), и во время итерации вы вносите изменения в список.Очевидно, у меня нет кода, но это то, что я могу видеть на основе вашего следа.

Так что я бы хотел внутри WriteArrayOfDeviceDTOToXml и искать места, где я изменяю список.

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


ОБНОВЛЕНИЕ

Хорошо, если вы не написали разделитель, то, кажется, что объект, который вы сериализуете (List<PositionServerDTO>) имеет другие ресурсы, которые, кажется, являются общими.На самом деле, исходя из названия, кажется, что оно имеет an array of devices, и поскольку ваш хранилище данных является одноэлементным, вы сталкиваетесь с проблемами синхронизации.Таким образом, фрагмент кода, который вы разместили, не там, где происходит проблема.Имеет ли PositionServerDTO список DeviceDTO?

На основании предоставленной информации это все, что я могу сказать.

...