WCF操作序列化集合错误

时间:2011-03-10 13:48:54

标签: 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.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 :(得分:0)

好的,这是你的问题:

您正在实现自己的XMlSerialization(因为我可以在跟踪中看到WriteArrayOfDeviceDTOToXml),并且在迭代期间,您正在对列表进行更改。显然我没有代码,但这是我可以根据你的踪迹看到的。

所以我想在WriteArrayOfDeviceDTOToXml内找到我要更改列表的地方。

或者,WriteArrayOfDeviceDTOToXml可能使用共享资源进行缓存,并在使用时对其进行更新。没有看到代码,这就是我所能说的。


更新

好的,如果你还没有编写一个seralizer,那么你正在序列化的对象(List<PositionServerDTO>)似乎有其他似乎是共享的资源。实际上,基于名称,它似乎有an array of devices,并且由于您的dataStore是单例,因此您遇到了同步问题。因此,您发布的代码片段不是问题发生的地方。 PositionServerDTO是否有DeviceDTO列表?

根据所提供的信息,我可以说。

答案 1 :(得分:0)

我有同样的问题。

WCF会自动为您生成序列化代码,使用您的对象名称通过反射。

我正在研究一个解决方案,我的下一步是实现我的契约代理,在我的缓存列表中执行ToList()重写此属性,然后传递给serialize而不更改缓存

我希望它对您有所帮助,如果您有更好的解决方案,请发布。

此致

杰弗逊