Я возвращаю коллекцию объектов 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.
У кого-нибудь есть идеи, что здесь происходит?