2013-03-15 11 views
26

Quando si utilizza il messaggio di broker nel bus di servizio di Azure, è possibile recuperare il corpo del messaggio con la chiamata. GetBody. Il codice è semplice:con il messaggio brokerato azzurro ottenere il corpo senza conoscere il tipo

Tuttavia, esiste un modo per recuperare il Corpo senza conoscere esplicitamente la classe dell'oggetto del corpo?

var msg = subscription.Receive(); 
Type bodyType = Type.GetType(msg.ContentType); 

var payload = msg.GetBody<bodyType>(); 

risposta

27

Ecco il codice completo per deserializzare dal brokeredmessage:

public T GetBody<T>(BrokeredMessage brokeredMessage) 
{ 
    var ct = brokeredMessage.ContentType; 
    Type bodyType = Type.GetType(ct, true); 

    var stream = brokeredMessage.GetBody<Stream>(); 
    DataContractSerializer serializer = new DataContractSerializer(bodyType); 
    XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max); 
    object deserializedBody = serializer.ReadObject(reader); 
    T msgBase = (T)deserializedBody; 
    return msgBase; 
} 
+2

Dipende da brokeredMessage.ContentType. Se inviamo semplicemente stringhe, questa proprietà può essere impostata o meno. C'è un modo per identificarne una semplice stringa, stream o tipo di classe? –

+0

Questa risposta ha aiutato a risolvere gli errori di serializzazione utilizzando GetBody () in un oggetto WebWorkerRole in Azure che tenta di accedere al corpo di un messaggio brokered. Grazie. – TombMedia

+0

@Joymon Non sono sicuro se è una buona pratica, ma è possibile impostare ContentType quando si invia il messaggio: var message = new BrokeredMessage (request); message.ContentType = request.GetType(). Name; – Dunc

55

Se l'intento è di afferrare il corpo del messaggio solo a prescindere dal contenuto, è possibile ottenerlo come flusso.

Stream stream = message.GetBody<Stream>(); 
StreamReader reader = new StreamReader(stream); 
string s = reader.ReadToEnd(); 
+1

Nizza punta! Questo dovrebbe essere stato parte della documentazione MSDN :) –

+1

Questo è anche molto utile per inter-op con Nodo in cui potresti voler mandare JSON attorno al corpo di un messaggio. –

5

Nel campione prima ContentType utilizzato per rilevare il tipo di corpo. Credo che ContentType debba essere impostato dal mittente. Faccio la stessa logica, ho impostato una delle proprietà del messaggio per il tipo di oggetto sul lato mittente e chiami GetBody <>() sul ricevitore con tipo ritirato dalla proprietà del messaggio. come questo:

public void SendData(object payloadData) 
    { 
     if (payloadData == null) return; 

     var queueClient = QueueClient.CreateFromConnectionString(ConnectionString, _queueName); 

     var brokeredMessage = new BrokeredMessage(payloadData); 
     brokeredMessage.Properties["messageType"] = payloadData.GetType().AssemblyQualifiedName; 
     queueClient.Send(brokeredMessage); 
    } 

Messaggio proprietà "messageType" ha nome completo del tipo.

Al ricevimento lato mi piace questo:

var messageBodyType = Type.GetType(receivedMessage.Properties["messageType"].ToString()); 
       if (messageBodyType == null) 
       { 
        //Should never get here as a messagebodytype should 
        //always be set BEFORE putting the message on the queue 
        Trace.TraceError("Message does not have a messagebodytype" + 
            " specified, message {0}", receivedMessage.MessageId); 
        receivedMessage.DeadLetter(); 
       } 


       //read body only if event handler hooked 
        var method = typeof(BrokeredMessage).GetMethod("GetBody", new Type[] { }); 
        var generic = method.MakeGenericMethod(messageBodyType); 
        try 
        { 
         var messageBody = generic.Invoke(receivedMessage, null); 
         DoSomethingWithYourData(); 
         receivedMessage.Complete(); 
        } 
        catch (Exception e) 
        { 
         Debug.Write("Can not handle message. Abandoning."); 
         receivedMessage.Abandon(); 
        } 
       } 
+0

Grazie signore! Questa è esattamente la soluzione che stavo cercando! –

Problemi correlati