2015-10-14 3 views
1

MongoDb .NET Driver System.FormatException/DecoderFallbackExceptionКак остановить Mongodb .NET драйвер, бросающий System.FormatException?

Произошла ошибка при десериализации описание свойства класса KerbToolsService.Models.promotion: Невозможно перевести байты [ED] [A0] с индексом 136 из указанную кодовую страницу в Юникод.

Приложение .NET API для веб-приложений, которое я написал для мониторинга состояния нашей системы на основе MongoDB/Node.js, начал бросать исключение DecoderFallbackException.

Вот трассировки стека

System.FormatException occurred 
    HResult=-2146233033 
Message=An error occurred while deserializing the description property of class KerbToolsService.Models.promotion: Unable to translate bytes [ED][A0] at index 136 from specified code page to Unicode. 
Source=MongoDB.Bson 

StackTrace: 
    at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap) 
InnerException: System.Text.DecoderFallbackException 
    HResult=-2147024809 
    Message=Unable to translate bytes [ED][A0] at index 136 from specified code page to Unicode. 
    Source=mscorlib 
    Index=136 
    StackTrace: 
     at System.Text.DecoderExceptionFallbackBuffer.Throw(Byte[] bytesUnknown, Int32 index) 
     at System.Text.DecoderExceptionFallbackBuffer.Fallback(Byte[] bytesUnknown, Int32 index) 
     at System.Text.DecoderFallbackBuffer.InternalFallback(Byte[] bytes, Byte* pBytes) 
     at System.Text.UTF8Encoding.GetCharCount(Byte* bytes, Int32 count, DecoderNLS baseDecoder) 
     at System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encoding) 
     at System.Text.UTF8Encoding.GetString(Byte[] bytes, Int32 index, Int32 count) 
     at MongoDB.Bson.IO.Utf8Helper.DecodeUtf8String(Byte[] bytes, Int32 index, Int32 count, UTF8Encoding encoding) 
     at MongoDB.Bson.IO.ByteBufferStream.ReadString(UTF8Encoding encoding) 
     at MongoDB.Bson.IO.BsonBinaryReader.ReadString() 
     at MongoDB.Bson.Serialization.Serializers.StringSerializer.DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args) 
     at MongoDB.Bson.Serialization.Serializers.SealedClassSerializerBase`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) 
     at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) 
     at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context) 
     at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap) 

До сих пор я знаю, что персонаж U+D83D, что закодированы ED A0 BD в BSON в документе в базе данных, и вызывает .NET UTF8Encoding бросить DecoderFallbackException. Другой код (пользовательский интерфейс MongoLab и наше приложение на основе Node.js) заменяет его ?, но он убивает запрос в драйвере .NET.

Я хочу, чтобы драйвер .NET Mongo вел себя так же, как и другие, и не взорвался, если видит недопустимый UTF-8.

ответ

2

Попробуйте установить свойство ReadEncoding на MongoClient таким образом:

MongoClient client = new new MongoClient(new MongoClientSettings() 
{ 
    Server = new MongoServerAddress("<serveraddress>", 27017), 
    ReadEncoding = new System.Text.UTF8Encoding(false, false) 
}); 

(Отредактировано: по словам @Craig Вильсона, параметры чтения после конструктора)

Второй параметр UTF8Encoding является " throwOnInvalidBytes ":

правда, чтобы указать, что при возникновении исключения при обнаружении недействителен кодирования; в противном случае, ложные

Источник: https://jira.mongodb.org/browse/CSHARP-996 и https://msdn.microsoft.com/en-us/library/302sbf78(v=vs.110).aspx

+1

вам, возможно, потребуется построить настройки и передать их в CTOR. Я думаю, что client.Settings только на данный момент. –

+1

Спасибо за информацию. Мне было интересно, почему объект кодирования был передан в стек mongo. Да, изменение настроек бросает: исключение первого шанса типа «System.InvalidOperationException» MongoClientSettings заморожено. Сначала попробую создать настройки. –

+0

Решенный: я отредактирую ответ с подробностями. Спасибо Stefano & @craig –

Смежные вопросы