WCF操作序列化集合错误
我正在从WCF操作返回DTO对象的集合 我在服务上遇到以下错误(这只是偶尔发生) 错误:集合已修改;枚举操作不能执行 堆栈跟踪:WCF操作序列化集合错误,wcf,serialization,dto,Wcf,Serialization,Dto,我正在从WCF操作返回DTO对象的集合 我在服务上遇到以下错误(这只是偶尔发生) 错误:集合已修改;枚举操作不能执行 堆栈跟踪: at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at System.Collections.Generic.List`1.Enum
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"));
}
}
公共列表GetPositionServers()
{
尝试
{
列表=新列表();
foreach(dataStore.PositionServerList.ToList()中的PositionServer posServer)
{
posServer.Statistics.CompileStatistics();
添加(Mapper.Map(posServer));
}
退货清单;
}
捕获(例外情况除外)
{
dataStore.Log.Error(“返回所有位置服务器时出错”,例如);
CustomException customerEx=新的CustomException(“返回所有职位服务器时出错”,170,例如消息,例如,“职位服务”,AMSLog.AlphaPositionService);
抛出新的FaultException(customerEx、新的FaultReason(customerEx.ErrorMessage)、新的FaultCode(“170”);
}
}
奇怪的是,错误似乎发生在DTO对象集合的序列化过程中,而不是在操作的实际主体中。我之所以知道这一点,是因为在catch语句中没有记录异常
我从未在调试时看到过这种情况,但我可以使用SvcTraceViewer将异常视为针对生产服务器设置的诊断跟踪的一部分(是的,我知道)
有人知道这是怎么回事吗?好的,这是你的问题: 您正在实现自己的XMlSerialization(因为我可以在跟踪中看到
WriterrayOfDeviceToToToXML
),并且在迭代过程中,您正在对列表进行更改。显然,我没有代码,但这是我可以看到的基于您的跟踪
因此,我希望在writearayofDeviceToToToXML
中查找我正在更改列表的位置
或者,WriteArrayOfDeviceToToToXML
使用共享资源进行缓存,并在使用时对其进行更新。没有看到代码,这就是我所能说的
使现代化 好的,如果您还没有编写seralizer,那么您正在序列化的对象(
列表
)似乎有其他共享的资源。事实上,从名称来看,它似乎有一个设备数组,而且由于您的数据存储是单例的,所以您遇到了同步问题。所以,您发布的代码片段不是问题发生的地方。PositionServerDTO
是否有DeviceDTO
的列表
根据给出的信息,我只能说。好的,这是您的问题: 您正在实现自己的XMlSerialization(因为我可以在跟踪中看到
WriterrayOfDeviceToToToXML
),并且在迭代过程中,您正在对列表进行更改。显然,我没有代码,但这是我可以看到的基于您的跟踪
因此,我希望在writearayofDeviceToToToXML
中查找我正在更改列表的位置
或者,WriteArrayOfDeviceToToToXML
使用共享资源进行缓存,并在使用时对其进行更新。没有看到代码,这就是我所能说的
使现代化 好的,如果您还没有编写seralizer,那么您正在序列化的对象(
列表
)似乎有其他共享的资源。事实上,从名称来看,它似乎有一个设备数组,而且由于您的数据存储是单例的,所以您遇到了同步问题。所以,您发布的代码片段不是问题发生的地方。PositionServerDTO
是否有DeviceDTO
的列表
根据提供的信息,我只能说这些。我也有同样的问题 WCF通过反射使用对象名自动为您生成序列化代码 我正在研究一个解决方案,我的下一步是实现我的契约代理,在我的缓存列表中执行ToList(),在传递到序列化之前重写此属性,而不更改缓存 我希望它能帮助你,如果你有更好的解决方案,请张贴它 问候,
杰斐逊我也有同样的问题 WCF通过反射使用对象名自动为您生成序列化代码 我正在研究一个解决方案,我的下一步是实现我的契约代理,在我的缓存列表中执行ToList(),在传递到序列化之前重写此属性,而不更改缓存 我希望它能帮助你,如果你有更好的解决方案,请张贴它 问候,
杰斐逊这是一个有趣而重要的问题。什么是数据存储?它是ORM数据库上下文吗?另外,您使用的是哪种实例化模式?数据存储是一个返回PositionServer对象列表的单例。不使用ORM,且服务上下文为每个会话。这是一个有趣而重要的问题。什么是数据存储?它是ORM数据库上下文吗?另外,您使用的是哪种实例化模式?数据存储是一个返回PositionServer对象列表的单例。不使用ORM,且服务上下文为每个会话。助教,谢谢你看。我肯定不是在使用我自己的序列化,而是让WCF为我序列化对象集合。不过我承认,看到WriteArrayOfDeviceToToXML很有趣,我认为它使用反射作为序列化过程的一部分(?)。该方法肯定不是我的方法(尽管DeviceDTO的对象肯定是)。的确,PositionServerDTO包含DeviceTo的数组列表。我已将此数组从位置serverdto中取出,错误不再发生。尽管如此,我仍然对这个过程感到不安——就像我说的问题发生在方法完成之后,在序列化过程perf的某个地方