无法JSONparsing从Node.js应用程序中从Azure服务总线收到的消息

这是我的JS代码从Azure服务总线接收消息

function receiveMessage(serviceBusTopic, serviceBusSubscriber, callback) { serviceBus.receiveSubscriptionMessage(serviceBusTopic, serviceBusSubscriber, { isPeekLock: true }, function (error, lockedMessage) { if (!error) { try { const receivedMessage = JSON.parse(lockedMessage.body); console.log('receivedMessage', receivedMessage); if (!_.isEqual(receivedMessage.Type, messageType.USERPROFILES_USER_UPDATED)) { return; } //Message received and locked callback(receivedMessage); serviceBus.deleteMessage(lockedMessage, function (deleteError) { if (!deleteError) { // Message deleted console.log('message has been deleted.'); } }); } catch (error) { console.log('Start debugging'); console.log(lockedMessage.body); } 

当我收到消息时,它有奇怪的编码和JSON.parse引发exception。

lockedMessage输出是:

 { body: '@\fbase64Binary\b3http://schemas.microsoft.com/2003/10/Serialization/ s\u0002{"Type":"SomeEvent" \u0001}', brokerProperties: { DeliveryCount: 9, EnqueuedSequenceNumber: 0, EnqueuedTimeUtc: 'Thu, 16 Nov 2017 23:50:16 GMT', LockToken: '6e3e311f-0fe9-4366-844d-18046fd000db', LockedUntilUtc: 'Fri, 17 Nov 2017 00:10:46 GMT', MessageId: 'nil', PartitionKey: '1d84084f-65af-4a33-bb30-62d97d85557d', SequenceNumber: 61643019899633670, SessionId: '1d84084f-65af-4a33-bb30-62d97d85557d', State: 'Active', TimeToLive: 1566804.069 }, location: '', contentType: 'application/xml; charset=utf-8', customProperties: { 'strict-transport-security': NaN, connection: NaN } } 

该消息来自.NET Core服务,该服务使用以下代码发送:

  var payload = JsonConvert.SerializeObject(SomeEvent); var serviceBusMessage = new Message(Encoding.UTF8.GetBytes(payload)); serviceBusMessage.SessionId = Guid.NewGuid().ToString("D"); topicClient.SendAsync(serviceBusMessage).Wait(); 

为什么Node.js不能parsing消息? 另一个.NET应用程序可以收到相同的消息没有任何问题。

为了避免这种情况,从.NET Core服务发送消息时,需要将ContentType设置为text/plain 。 所以它应该是这样的:

 var payload = JsonConvert.SerializeObject(SomeEvent); var serviceBusMessage = new Message(Encoding.UTF8.GetBytes(payload)) { ContentType = "text/plain" }; serviceBusMessage.SessionId = Guid.NewGuid().ToString("D"); topicClient.SendAsync(serviceBusMessage).Wait(); 

在这篇文章中 ,他们解释了.NET的问题和解决scheme。

更新:

经过一番潜水之后,当我使用.NET Core或.NET向标准库Microsoft.Azure.ServiceBus发送消息(是否指定ContentType )时,这种情况不会发生在我身上。

这是我的C#代码发送消息:

 class Program { static void Main(string[] args) { string connectionString = "Endpoint=sb://..."; var client = new TopicClient(connectionString, "MyTopic"); var payload = JsonConvert.SerializeObject(new DemoMessage() { Title = $"hello core!!! {DateTime.Now}" }); var serviceBusMessage = new Message(Encoding.UTF8.GetBytes(payload)); serviceBusMessage.SessionId = Guid.NewGuid().ToString("D"); client.SendAsync(serviceBusMessage).Wait(); } private class DemoMessage { public DemoMessage() { } public string Title { get; set; } } } 

这是我的Node.js代码来接收消息:

 var azure = require('azure'); var serviceBusService = azure.createServiceBusService("Endpoint=sb://..."); serviceBusService.receiveSubscriptionMessage('MyTopic', 'sub1', { isPeekLock: true }, function(error, lockedMessage) { if(!error) { console.log(lockedMessage); serviceBusService.deleteMessage(lockedMessage, function (deleteError){ if(!deleteError){ // Message deleted console.log('message has been deleted.'); } }) } }); 

lockedMessage输出是:

在这里输入图像说明


这只发生在我使用.NET和SDK WindowsAzure.ServiceBus与这个代码:

 class Program { static void Main(string[] args) { string connectionString = "Endpoint=sb://..."; var client = TopicClient.CreateFromConnectionString(connectionString, "MyTopic"); var payload = JsonConvert.SerializeObject(new DemoMessage() { Title = $"hello core!!! {DateTime.Now}" }); var serviceBusMessage = new BrokeredMessage(Encoding.UTF8.GetBytes(payload)); serviceBusMessage.SessionId = Guid.NewGuid().ToString("D"); client.Send(serviceBusMessage); } private class DemoMessage { public DemoMessage() { } public string Title { get; set; } } } 

现在, lockedMessage输出是:

在这里输入图像说明

所以,我认为你收到的消息是从另一个.NET客户端发送的,我build议你在Node.js中testing之前清除该主题的所有消息。