2017-07-12 2 views
2

Je souhaite envoyer un message via Azure Service Bus à partir d'une application de console .NET Core et le recevoir dans une application de console .NET 4.6. Dans .NET Core, j'utilise le nouveau client de bus de service d'Azure pour l'expéditeur qui n'est pas encore destiné à la production (selon leur readme).Envoyer un message sur Azure ServiceBus de l'expéditeur .NET Core à un gestionnaire .NET 4.6

https://github.com/Azure/azure-service-bus-dotnet

je peux envoyer de base .NET et recevoir avec Core .NET assez facilement en utilisant les échantillons. Toutefois, lorsque l'application .NET 4.6 souscrit au sujet et reçoit le même message l'application .NET 4.6 génère cette exception:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: 
Exception while executing function: Functions.ProcessEvent 
System.InvalidOperationException: Exception binding parameter 'message' 
The BrokeredMessage with ContentType 'string' failed to 
deserialize to a string with the message: 
'Expecting element 'string' from namespace 
'http://schemas.microsoft.com/2003/10/Serialization/'.. 
Encountered 'Element' with name 'base64Binary', namespace 
http://schemas.microsoft.com/2003/10/Serialization/'. ' ---> 
System.Runtime.Serialization.SerializationException: Expecting element 
'string' from namespace 
http://schemas.microsoft.com/2003/10/Serialization/'.. Encountered 'Element' 
with name 'base64Binary', namespace 
'http://schemas.microsoft.com/2003/10/Serialization/'. 


System.Runtime.Serialization.DataContractSerializer.InternalReadObject 
(XmlReaderDelegator xmlReader, Boolean verifyObjectName, 
DataContractResolver dataContractResolver) at 
System.Runtime.Serialization.XmlObjectSerializer. 
ReadObjectHandleExceptions(XmlReaderDelegator reader, 
Boolean verifyObjectName, DataContractResolver dataContractResolver) 

Mon code .NET émetteur de base est:

using Microsoft.Azure.ServiceBus; 

var topicClient = new TopicClient(ServiceBusConnectionString, "topic1"); 
var msg = new Message(Encoding.UTF8.GetBytes("Hello world")); 
topicClient.SendAsync(msg).Wait(); 

Mon .NET 4.6 code récepteur est:

using Microsoft.Azure.WebJobs; 

    static void Main() 
    { 
     var config = new JobHostConfiguration(); 
     config.UseTimers(); 
     config.UseServiceBus(); 
     var host = new JobHost(config); 
     host.RunAndBlock(); 
    } 

    public void ProcessEvent([ServiceBusTrigger("topic1", "the-same-endpoint-as-connection-string")] string message, TextWriter logger) 
    { 
     Console.Writeline(message); 
    } 

Remarque Je ne peux pas changer le récepteur comme il est un ancien système.

+0

Pouvez-vous ajouter le code du gestionnaire pour l'application de la console? Comment essayez-vous de lire le message? –

+0

On dirait que le problème peut être avec le sérialiseur .NET, pouvez-vous essayer d'utiliser la sérialisation JSON? –

+0

Vous envoyez les octets bruts de file d'attente, mais attendez de recevoir une chaîne de l'autre côté. Une partie de la méta-information du message est le type de contenu, je pense qu'il ne sait pas quoi faire avec la conversion byte-> string car il ne sait pas quel type d'octet [] vous avez envoyé. –

Répondre

3

Je suppose que le problème est parce que le noyau .NET publie le message sérialisé comme JSON au sujet, mais le code 4.6 NET tente de désérialiser le message de l'abonnement avec le DataContract Serializer (XML?), Dans la mesure Comme je sais, c'est la méthode de désérialisation par défaut pour la bibliothèque complète de framework .Net.

Si tel est le cas et vous ne pouvez pas modifier le code de réception, vous devez serialize le message avec DataContractSerializer sur .Net base:

var ser = new System.Runtime.Serialization.DataContractSerializer(typeof(string)); 
var ms = new MemoryStream(); 
ser.WriteObject(ms, "hello world"); 
var msg = new Message(ms.ToArray()); 

Vous aurez besoin du paquet NuGet System.Runtime.Serialization.Xml

+0

Le message BrokeredMessage avec ContentType 'null' n'a pas pu être désérialisé en une chaîne avec le message suivant: 'Expecting element' string 'de l'espace de noms' http://schemas.microsoft.com/2003/10/Serialization/ '.. Rencontré' Element ' avec le nom 'base64Binary', espace de noms 'http://schemas.microsoft.com/2003/10/Serialization/'. ' – ddcc3432

+0

J'ai essayé votre échantillon. Je pense que le récepteur .NET 4.6 a besoin de connaître ContentType pour le désérialiser. – ddcc3432

+0

https://stackoverflow.com/questions/47427361/azure-service-bus-read-messages-sent-by-net-core-2-with-brokeredmessage-getbo – lohiarahul