[英]with azure brokeredmessage get the body without knowing the type
在Azure Service Bus中使用代理消息時,可以通過調用.GetBody檢索消息的正文。 代碼很簡單:
var msg = subscription.Receive();
MyPayload payload = msg.GetBody<MyPayload>();
但是,有沒有一種方法可以在不顯式知道body對象類的情況下檢索Body?
var msg = subscription.Receive();
Type bodyType = Type.GetType( msg.ContentType);
var payload = msg.GetBody<bodyType>();
如果目的是僅獲取消息正文而不管其內容如何,都可以將其作為流獲取。
Stream stream = message.GetBody<Stream>();
StreamReader reader = new StreamReader(stream);
string s = reader.ReadToEnd();
這是要從代理消息反序列化的完整代碼:
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;
}
在ContentType之前的樣本中,它用於檢測主體類型。 我相信ContentType應該由發送者設置。 我執行類似的邏輯,我將消息屬性之一設置為發送方對象的類型,並使用從消息屬性檢索的類型調用接收方的GetBody <>()。 像這樣:
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);
}
消息屬性“ messageType”具有類型的全名。
在接收方,我這樣做:
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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.