我正在从WCF操作返回一组DTO对象。
我在服务上遇到以下错误(这只会偶尔发生)
错误:收集已修改;枚举操作可能无法执行。
堆栈追踪:
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将异常视为针对生产服务器设置的诊断跟踪的一部分(是的,我知道)。
有人知道这里发生了什么吗?
答案 0 :(得分:0)
好的,这是你的问题:
您正在实现自己的XMlSerialization(因为我可以在跟踪中看到WriteArrayOfDeviceDTOToXml
),并且在迭代期间,您正在对列表进行更改。显然我没有代码,但这是我可以根据你的踪迹看到的。
所以我想在WriteArrayOfDeviceDTOToXml
内找到我要更改列表的地方。
或者,WriteArrayOfDeviceDTOToXml
可能使用共享资源进行缓存,并在使用时对其进行更新。没有看到代码,这就是我所能说的。
好的,如果你还没有编写一个seralizer,那么你正在序列化的对象(List<PositionServerDTO>
)似乎有其他似乎是共享的资源。实际上,基于名称,它似乎有an array of devices
,并且由于您的dataStore是单例,因此您遇到了同步问题。因此,您发布的代码片段不是问题发生的地方。 PositionServerDTO
是否有DeviceDTO
列表?
根据所提供的信息,我可以说。
答案 1 :(得分:0)
我有同样的问题。
WCF会自动为您生成序列化代码,使用您的对象名称通过反射。
我正在研究一个解决方案,我的下一步是实现我的契约代理,在我的缓存列表中执行ToList()重写此属性,然后传递给serialize而不更改缓存
我希望它对您有所帮助,如果您有更好的解决方案,请发布。
此致
杰弗逊