2016-09-16 5 views
1

Я полностью зелёный, и это заставляет меня гаснуть - он работает для некоторых наборов данных, но не для других.Ошибка XML: значение было слишком большим или слишком маленьким для байта без знака

EDIT: похоже, что это связано с количеством записей - так или иначе, когда количество записей достигает определенной суммы - может быть, что-то вроде 250 - вот когда он сбой XML. Как-то кажется, что задействован первичный ключ с идентификатором автоматического увеличения, потому что я вижу, что когда я добавляю даже 3 записи, когда столбец идентификатора попал в 400, но все записи удалены, он все равно производит ту же ошибку, но когда я возвращаю идентификатор обратно к нулю - те же 3 записи могут быть добавлены и должным образом отформатированы в теле XML.

типы карт: Int32 -> Байт System.Int32 - путь> System.Byte Направление: FixtureDto.ExchangeType.ExchangeType.Id.Id Источник значение: 268

Значение было либо слишком велик или слишком мал для неподписанных байт.

Тип объекта ObjectContent`1 не смог сериализовать тело ответа для типа контента 'application/xml; кодировка = UTF-8' .

enter image description here

<Error> 
 
<Message>An error has occurred.</Message> 
 
<ExceptionMessage> 
 
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'. 
 
</ExceptionMessage> 
 
<ExceptionType>System.InvalidOperationException</ExceptionType> 
 
<StackTrace/> 
 
<InnerException> 
 
<Message>An error has occurred.</Message> 
 
<ExceptionMessage> 
 
Mapping types: Int32 -> Byte System.Int32 -> System.Byte Destination path: FixtureDto.ExchangeType.ExchangeType.Id.Id Source value: 268 
 
</ExceptionMessage> 
 
<ExceptionType>AutoMapper.AutoMapperMappingException</ExceptionType> 
 
<StackTrace> 
 
at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext() at WriteArrayOfFixtureDtoToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract) at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) at System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content) at System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__1b.MoveNext() 
 
</StackTrace> 
 
<InnerException> 
 
<Message>An error has occurred.</Message> 
 
<ExceptionMessage> 
 
Value was either too large or too small for an unsigned byte. 
 
</ExceptionMessage> 
 
<ExceptionType>System.OverflowException</ExceptionType> 
 
<StackTrace> 
 
at System.Convert.ToByte(Int32 value) at System.Int32.System.IConvertible.ToByte(IFormatProvider provider) at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) at System.ComponentModel.BaseNumberConverter.ConvertTo(ITypeDescriptorContext context, CultureInfo culture, Object value, Type destinationType) at AutoMapper.Mappers.TypeConverterMapper.<>c__DisplayClass1_0.<GetConverter>b__0() at AutoMapper.Mappers.TypeConverterMapper.Map(ResolutionContext context, IMappingEngineRunner mapper) at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) 
 
</StackTrace> 
 
</InnerException> 
 
</InnerException> 
 
</Error>

+0

Я думаю, что решил. Имел int для поля ID, но имел его в качестве байта в поле для отображения Dto. – user6063812

+0

OK good.hope либо вы можете поместить его как 'answer' или' delete' этот пост. – Sampath

+0

Пока я надеюсь, что это действительно решило проблему раз и навсегда - это уже третий раз, когда я опубликовал и придумал «решение» этой проблемы в одном обличье, иначе вы простите меня, если я возьму немного прежде чем спешить, чтобы завершить успех, прежде чем правильно тестировать его в течение удовлетворительного периода времени. – user6063812

ответ

3

Решено!

Я изменил тип данных в моем определении класса базы данных с байта на int, но упустил отражение того же изменения в моем эквивалентном объекте переноса данных.

Это был шип в стороне в течение некоторого времени и третья попытка добраться до его нижней части, предыдущая попытка here и here.

В конце концов, благодаря кропотливому повторному тестированию я понял, что это никак не связано с добавлением индексов к таблицам или плохими данными или повторным добавлением автоинкремента идентификатора, но через количество записей в базе данных, ограниченное на их дисплее через ошибку сопоставления передачи данных, т. е. байтовый определенный столбец идентификатора, ограничивающий число.

Я изменил определение dto на int, чтобы он соответствовал базе данных, и теперь он красиво масштабируется до более чем 255 записей одновременно, как это было проверено, как следует.
enter image description here