topics topic porta example c# azure azureservicebus

c# - topic - con blueure brokeredmessage obtener el cuerpo sin saber el tipo



porta azure (3)

Aquí está el código completo para deserializar del mensaje brokered:

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; }

Cuando está utilizando el mensaje intermediario en el Bus de servicios de Azure, puede recuperar el cuerpo del mensaje con la llamada .GetBody. El código es simple:

var msg = subscription.Receive(); MyPayload payload = msg.GetBody<MyPayload>();

Sin embargo, ¿hay alguna manera de recuperar el Cuerpo sin conocer explícitamente la clase del objeto corporal?

var msg = subscription.Receive(); Type bodyType = Type.GetType( msg.ContentType); var payload = msg.GetBody<bodyType>();


En la muestra antes de ContentType utilizado para detectar el tipo de cuerpo. Creo que ContentType debe ser establecido por el remitente. Hago una lógica similar, establezco una de las propiedades del mensaje para el tipo de objeto en el lado del remitente y llamo a GetBody <> () en el receptor con el tipo recuperado de la propiedad del mensaje. Me gusta esto:

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); }

La propiedad del mensaje "messageType" tiene el nombre completo del tipo.

En recepción, me gusta esto:

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(); } }


Si la intención es capturar el cuerpo del mensaje independientemente del contenido, puede obtenerlo como una transmisión.

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