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();
}
}
fonte
2013-11-11 18:58:53
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? –
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
@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