由于 Newtonsoft JsonReaderException

问题描述

我们在反序列化命令时遇到随机异常。我们有一个将消息放入队列的仅发送 API。尝试使用消息但失败。无论消息类型如何,它都会随机发生。有时后端可以反序列化消息。 我们将 NServiceBus 设置为使用认设置的 NewtonSoft.Json(API 使用 12.0.3,后端使用 12.0.1)。我们不使用不显眼的模式,因为我们用 ICommand 声明了我们的命令。作为传输,我们使用 Azure ServiceBus。

最令人不安的是:我们在临时环境 (BETA) 中拥有几乎完全相同的基础架构,并且一切正常。当我们在两种环境(BETA 和 PRODUCTION)上重现相同的消息时,可以在 BETA 上使用相同的数据对消息进行反序列化,而在 PRODUCTION 上则不能。所有标头和正文数据都是相同的,即使是包含的消息类型也是如此。两种环境都使用相同(二进制相同)的二进制文件。两种环境都在 Azure 上几乎相同的配置应用服务上运行(例如 net core 3.1、win 64 位)。

{
  "AmqpMessage": null,"Body": "{\"Email\":\"vofil69829@bbsaili.com\",\"AccountantId\":{\"Value\":\"75f61737-b9e8-40a3-a1c4-23d7bd61c527\"}}","MessageId": "d829e8ce-261f-4033-a294-f279c0390851","PartitionKey": null,"TransactionPartitionKey": null,"SessionId": null,"ReplyToSessionId": null,"TimetoLive": "10675199.02:48:05.4775807","CorrelationId": "2ca22dd7-396b-4950-acb6-ad4800ac9d65","Subject": null,"To": null,"ContentType": "application/json","ReplyTo": null,"ScheduledEnqueueTime": "0001-01-01T00:00:00+00:00","ApplicationProperties": {
    "NServiceBus.Transport.Encoding": "application/octect-stream","NServiceBus.MessageId": "2ca22dd7-396b-4950-acb6-ad4800ac9d65","NServiceBus.MessageIntent": "Send","NServiceBus.ConversationId": "97743453-c3ac-4e08-a1df-ad4800ac9d65","NServiceBus.CorrelationId": "2ca22dd7-396b-4950-acb6-ad4800ac9d65","NServiceBus.OriginatingMachine": "dw1sdwk00002R","NServiceBus.OriginatingEndpoint": "AwarenessCenter.Api","$.diagnostics.originating.hostid": "a5a720d14ccabd7a8ba708f5bc79b2a3","NServiceBus.ContentType": "application/json","NServiceBus.EnclosedMessageTypes": "AwarenessCenter.Domain.Users.Registration.InviteUserCommand,AwarenessCenter.Domain,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null","NServiceBus.Version": "7.4.4","NServiceBus.TimeSent": "2021-06-15 10:28:28:288468 Z","Diagnostic-Id": "00-1d6433cf14ae654a84e290f66d5faf25-3b4885ae29c8fc4f-00","NServiceBus.ExceptionInfo.ExceptionType": "NServiceBus.MessageDeserializationException","NServiceBus.ExceptionInfo.InnerExceptionType": "Newtonsoft.Json.JsonReaderException","NServiceBus.ExceptionInfo.HelpLink": null,"NServiceBus.ExceptionInfo.Message": "An error occurred while attempting to extract logical messages from incoming physical message 2ca22dd7-396b-4950-acb6-ad4800ac9d65","NServiceBus.ExceptionInfo.source": "NServiceBus.Core","NServiceBus.ExceptionInfo.StackTrace": "NServiceBus.MessageDeserializationException: An error occurred while attempting to extract logical messages from incoming physical message 2ca22dd7-396b-4950-acb6-ad4800ac9d65\r\n ---> Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: {. Path 'AccountantId',line 1,position 50.\r\n   at Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType)\r\n   at Newtonsoft.Json.JsonTextReader.ReadAsstring()\r\n   at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract,Boolean hasConverter)\r\n   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject,JsonReader reader,JsonObjectContract contract,JsonProperty member,String id)\r\n   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader,Type objectType,JsonContract contract,JsonContainerContract containerContract,JsonProperty containerMember,Object existingValue)\r\n   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader,Object existingValue)\r\n   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader,Boolean checkAdditionalContent)\r\n   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader,Type objectType)\r\n   at NServiceBus.Newtonsoft.Json.JsonMessageSerializer.Readobject(Stream stream,Boolean isArrayStream,Type type)\r\n   at NServiceBus.Newtonsoft.Json.JsonMessageSerializer.DeserializeMultipleMessageTypes(Stream stream,IList`1 messageTypes,Boolean isArrayStream)\r\n   at NServiceBus.Newtonsoft.Json.JsonMessageSerializer.Deserialize(Stream stream,IList`1 messageTypes)\r\n   at NServiceBus.DeserializeMessageConnector.Extract(IncomingMessage physicalMessage) in /_/src/NServiceBus.Core/Pipeline/Incoming/DeserializeMessageConnector.cs:line 119\r\n   at NServiceBus.DeserializeMessageConnector.ExtractWithExceptionHandling(IncomingMessage message) in /_/src/NServiceBus.Core/Pipeline/Incoming/DeserializeMessageConnector.cs:line 53\r\n   --- End of inner exception stack trace ---\r\n   at NServiceBus.DeserializeMessageConnector.ExtractWithExceptionHandling(IncomingMessage message) in /_/src/NServiceBus.Core/Pipeline/Incoming/DeserializeMessageConnector.cs:line 53\r\n   at NServiceBus.DeserializeMessageConnector.Invoke(IIncomingPhysicalMessageContext context,Func`2 stage) in /_/src/NServiceBus.Core/Pipeline/Incoming/DeserializeMessageConnector.cs:line 29\r\n   at NServiceBus.InvokeAuditPipelineBehavior.Invoke(IIncomingPhysicalMessageContext context,Func`2 next) in /_/src/NServiceBus.Core/Audit/InvokeAuditPipelineBehavior.cs:line 27\r\n   at NServiceBus.ProcessingStatisticsBehavior.Invoke(IIncomingPhysicalMessageContext context,Func`2 next) in /_/src/NServiceBus.Core/Performance/Statistics/ProcessingStatisticsBehavior.cs:line 32\r\n   at NServiceBus.TransportReceivetoPhysicalMessageConnector.Invoke(ITransportReceiveContext context,Func`2 next) in /_/src/NServiceBus.Core/Pipeline/Incoming/TransportReceivetoPhysicalMessageConnector.cs:line 61\r\n   at NServiceBus.MainPipelineExecutor.Invoke(MessageContext messageContext) in /_/src/NServiceBus.Core/Pipeline/MainPipelineExecutor.cs:line 50\r\n   at NServiceBus.Transport.AzureServiceBus.MessagePump.InnerProcessMessage(Task`1 receiveTask)","NServiceBus.TimeOfFailure": "2021-06-15 10:28:28:346039 Z","NServiceBus.ExceptionInfo.Data.Message ID": "2ca22dd7-396b-4950-acb6-ad4800ac9d65","NServiceBus.ExceptionInfo.Data.Transport message ID": "b6c3a3cf-84bf-4235-8551-35a1daf4bc5d","NServiceBus.FailedQ": "AwarenessCenter.Backend","NServiceBus.ProcessingMachine": "dw1sdwk00002R","NServiceBus.ProcessingEndpoint": "AwarenessCenter.Backend","$.diagnostics.hostid": "f0377aabcaf4cc26d4afb3e60b704550","$.diagnostics.hostdisplayname": "dw1sdwk00002R"
  },"LockToken": "00000000-0000-0000-0000-000000000000","DeliveryCount": 0,"LockedUntil": "0001-01-01T00:00:00+00:00","SequenceNumber": 541,"DeadLetterSource": null,"PartitionId": 0,"EnqueuedSequenceNumber": 0,"EnqueuedTime": "2021-06-15T10:28:28.396+00:00","LockTokenGuid": "00000000-0000-0000-0000-000000000000","ExpiresAt": "9999-12-31T23:59:59.9999999+00:00","DeadLetterReason": null,"DeadLetterErrorDescription": null
}

解决方法

我怀疑消息的序列化没有正确完成,或者序列化和反序列化的类型不相同。 NServiceBus 抛出的异常暗示了什么(有关详细信息,请参阅 NServiceBus.ExceptionInfo.StackTrace 标头。具体来说

尝试从传入的物理消息 2ca22dd7-396b-4950-acb6-ad4800ac9d65\r\n 中提取逻辑消息时发生错误\r\n ---> Newtonsoft.Json.JsonReaderException: 解析值时遇到意外字符:{。路径 'AccountantId',第 1 行,位置 50

基于序列化的payload

"{"Email":"vofil69829@bbsail.com","AccountantId":{"Value":"75f61737-b9e8-40a3-a1c4-23d7bd61c527"}}"

看起来 AccountantId 不是简单类型而是嵌套类型,因为 JSON 转换为

{
    "Email":"vofil69829@bbsaili.com","AccountantId":
    {
        "Value":"75f61737-b9e8-40a3-a1c4-23d7bd61c527"
    }
}

我怀疑接收方的期望是看到以下类型的消息

class SomeContract
{
  public string Email { get; set; }
  public Guid AccountantId { get; set; }
}
,

因此,在我们使用完全相同的代码基础进行第三次部署后,问题自行解决。我们不知道是什么导致了这个问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...