Abbiamo l'involucro sotto intorno al Cliente Azure Service Bus:Codifica di BrokeredMessage Corpo in Azure Service Bus
public virtual void SendMessage(object bodyObject)
{
var brokeredMessage =
_messageBodySerializer.SerializeMessageBody(bodyObject);
_queueClient.Send(brokeredMessage);
}
Con la SerializeMessageBody
composto da:
public BrokeredMessage SerializeMessageBody(object bodyObject)
{
var brokeredMessage = new BrokeredMessage(bodyObject);
brokeredMessage.Properties[MESSAGE_TYPE_PROPERTY_KEY] =
bodyObject.GetType().AssemblyQualifiedName;
return brokeredMessage;
}
Ho scritto un test di integrazione per verificare questo funziona eseguendo SendMessage
quindi visualizzando il contenuto del messaggio utilizzando Service Bus Explorer 2.0. Lo stiamo facendo per garantire che possiamo riparare e inviare nuovamente i messaggi utilizzando lo strumento per modificare l'XML. Il messaggio che sto inviando assomiglia a questo:
[DataContract]
public class TestServiceBusMessage
{
[DataMember]
public Guid ExternalIdentifier { get; set; }
[DataMember]
public int Identifier { get; set; }
[DataMember]
public string Name { get; set; }
}
Il problema è; quando il corpo del messaggio viene visualizzato sullo strumento, invece di guardare come XML invece viene fuori come di seguito:
@TestServiceBusMessageWhttp://schemas.datacontract.org/2004/07/IntegrationTests.Common.Azure.ServiceBus i)http://www.w3.org/2001/[email protected][email protected]
Identifier?& @Name?Test Message
Suppongo che questo è un problema di codifica; tuttavia non riesco a vedere un modo per impostare la codifica quando si passa il corpo nel costruttore BrokeredMessage
; o definendolo tramite un attributo DataContract
.
Come risolvere questo problema di codifica? Dovrei fornire il mio serializer/stream o c'è un modo per forzare il serializzatore predefinito a codificare correttamente?
che ha funzionato alla perfezione; l'aggiunta dell'istanza 'DataContractSerializer' nel costruttore risolve il problema di codifica, grazie Paolo. (PS: [Azure Service Bus Explorer] (http://blogs.msdn.com/b/paolos/archive/2013/04/12/service-bus-explorer-2-0-released.aspx) è eccellente) –
Inoltre ho pubblicato un post sul mio blog che descrive in dettaglio i diversi modi in cui è possibile codificare/decodificare il corpo del messaggio quando si utilizzano diversi protocolli/piattaforme per inviare e ricevere messaggi: http://abhishekrlal.com/2012/03/30/formatting -the-content-for-service-bus-messages/ –
Esiste una soluzione alternativa quando il messaggio è già presente nella coda DeadLetter? Come posso ottenere SBE per mostrare il messaggio che è stato già inviato, senza modificare il meccanismo di invio. Abbiamo un problema che non possiamo inviare nuovamente i messaggi tramite SBE. Sembra che SBE non riesca a inviare nuovamente i messaggi che sono stati creati usando semplicemente 'new BrokeredMessage (body);' – Botis