如何阻止Mongodb .NET驱动程序抛出System.FormatException?

问题描述 投票:2回答:1

MongoDb .NET驱动程序System.FormatException / DecoderFallbackException

反序列化类KerbToolsService.Models.promotion的description属性时发生错误:无法将索引136处的字节[ED] [A0]从指定代码页转换为Unicode。

我写的一个.NET Web 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)

到目前为止,我知道在bson中编码为U+D83D的字符ED A0 BD位于数据库中的文档中,并导致.NET UTF8Encoding抛出DecoderFallbackException。其他代码(MongoLab UI和我们基于Node.js的应用程序)用?替换它,但它在.NET驱动程序中杀死了查询。

我想让.NET Mongo驱动程序的行为与其他驱动程序相同,如果它看到无效的UTF-8,则不会爆炸。

c# mongodb mongodb-.net-driver
1个回答
4
投票

尝试以这种方式在MongoClient上设置ReadEncoding属性:

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

(编辑:正如@Craig Wilson所说,设置在构造函数后只读)

UTF8Encoding的第二个参数是“throwOnInvalidBytes”:

如果检测到无效编码,则指定抛出异常;如果为true,则为true;否则,错误

资料来源:https://jira.mongodb.org/browse/CSHARP-996https://msdn.microsoft.com/en-us/library/302sbf78(v=vs.110).aspx

© www.soinside.com 2019 - 2024. All rights reserved.