在
樣品之前的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);
}
Message屬性 「爲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();
}
}
這取決於brokeredMessage.ContentType。如果我們只是發送字符串,這個屬性可能會或可能不會被設置。有什麼方法可以識別它的簡單字符串,流或類類型嗎? – 2013-06-25 14:03:31
此答案幫助解決了Azure中的WebWorkerRole上的GetBody()嘗試訪問中介消息正文的序列化錯誤。謝謝。 –
TombMedia
2013-07-02 09:41:34
@Joymon不知道這是否是好的做法,但可以在發送消息時設置ContentType:var message = new BrokeredMessage(request); message.ContentType = request.GetType()。Name; – Dunc 2015-05-06 18:34:41