[英]Azure ServiceBus Message Serialization/Deserialization
我正在使用 .NET Core 應用程序通過 Azure 服務總線隊列發送對象,並讓 Web 作業(.NET Core 也是如此)接收它。
我的問題是如何序列化/反序列化以發送/接收對象?
我發現很多對舊版BroakerMessage.GetBody()
的引用來接收消息,但沒有引用新的 .NET Core 方法。 請指教,謝謝。
發件人代碼:
using Microsoft.Azure.ServiceBus;
MyClass object = new MyClass();
var message = new Message(object);
await queueClient.SendAsync(message);
接收器代碼:
using Microsoft.Azure.ServiceBus;
public void ProcessQueueMessage([ServiceBusTrigger("queue")] Message message, TextWriter log)
{
}
可以使用 JSON 序列化來傳輸這些對象/實體。
假設以下類是將向 Azure 服務總線隊列發送/從 Azure 服務總線隊列接收的對象實例的類型:
public class Customer{ public string Name { get; set; } public string Email { get; set; } }
- - 發送 - -
在下面找到發送客戶對象實例的示例代碼(.NET Core 2.0 控制台應用程序):
QueueClient queueClient = new QueueClient(connectionString, queueName);
string messageBody = JsonConvert.SerializeObject(obj);
Message message = new Message(Encoding.UTF8.GetBytes(messageBody))
{
SessionId = sessionId
};
await queueClient.SendAsync(message);
- - 收到 - -
在下面查找 Azure 函數(服務總線隊列觸發器/.NET Standard 2.0)示例代碼以接收消息並對其進行反序列化:
[FunctionName("ServiceBusQueueFunction")]
public static void Run([ServiceBusTrigger("taskqueue", Connection = "ServiceBusConnectionString")] Message message, TraceWriter log)
{
Customer customer = JsonConvert.DeserializeObject<Customer>(Encoding.UTF8.GetString(message.Body));
}
以下 NuGet 包用於/測試上述示例:
考慮閱讀:在 JSON.NET 的性能提示文章下方找到: https ://www.newtonsoft.com/json/help/html/Performance.htm
設計原理:在最新的 Microsoft.Azure.ServiceBus 中刪除了內置 POCO 序列化支持。 這是因為“雖然這種隱藏的序列化魔法很方便,但應用程序應該顯式控制對象序列化並將它們的對象圖轉換為流,然后再將它們包含到消息中,並在接收方執行相反的操作。這會產生可互操作的結果。”
https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messages-payloads
如何序列化/反序列化以發送/接收對象?
請參考demo代碼吹:
發信息:
var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(obj));
await queueClient.SendAsync(new Message { Body = body, ContentType = "text/plain" });
在.net核心WebJob中
var body = Encoding.UTF8.GetString(message.Body);
var obj = JsonConvert.DeserializeObject<T>(body);
測試結果:
這些都不適合我,因為:
當我們嘗試將消息正文解析為 JSON 時出現異常,因為我們接收的消息正文是
"@\u0006string\b3http://schemas.microsoft.com/2003/10/Serialization/?\u000b{ \"a\": \"1\"}"
這是因為“代理消息通過使用帶有二進制 XmlDictionaryWriter 的 DataContractSerializer 從給定對象初始化 BrokeredMessage 類的新實例”。
參考: https : //www.bfcamara.com/post/84113031238/send-a-message-to-an-azure-service-bus-queue-with
所以我改用這篇博文: https : //abhishekrlal.com/2012/03/30/formatting-the-content-for-service-bus-messages/
示例 1:使用字符串
使用字符串和默認(DataContract + Binary)序列化程序創建 BrokeredMessage 時:
BrokeredMessage stringDefaultMessage = new BrokeredMessage("default string");
您可以通過以下方式接收此消息:
string s = receiveMessage.GetBody<string>();
我也遇到了這個要求,並制作了一個簡單的序列化/反序列化庫來包裝這個功能。 你可以在這里找到它 ,它可能有助於實現其他任何人遇到這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.