![](/img/trans.png)
[英]Error while deserializing Azure ServiceBus Queue message sent from node.js (azure sdk)
[英]Unable to serialize Azure ServiceBus Message - Error getting value from 'ExpiresAtUtc'
我需要編寫一個測試,在其中手動創建Microsoft.Azure.ServiceBus.Message並將其序列化為JSON。 示例代碼:
var message = new Microsoft.Azure.ServiceBus.Message
{
MessageId = "0c8dfad9-6f0f-4d7f-a248-2a48fc899486",
CorrelationId = "78b507b0-6266-458d-afe6-7882c935e481",
Body = Encoding.UTF8.GetBytes("Hello world"),
};
var json = JsonConvert.SerializeObject(message);
但是,序列化時出現以下異常:
Newtonsoft.Json.JsonSerializationException :
Error getting value from 'ExpiresAtUtc' on 'Microsoft.Azure.ServiceBus.Message'.
---- System.InvalidOperationException : Operation is not valid due to the current state of the object.
有什么想法可以創建有效的消息(以后可以序列化)嗎? ExpiresAtUtc僅獲取,因此無法直接設置。 有沒有辦法間接設置它?
ExpiresAtUtc
由代理設置,被認為是內部的( SystemProperties
集合),並以此方式進行了有意設計。 關於測試存在一個類似的問題 ,如果您真的需要它,唯一的方法是使用反射。
var message = new Message();
//message.TimeToLive = TimeSpan.FromSeconds(10);
var systemProperties = new Message.SystemPropertiesCollection();
// systemProperties.EnqueuedTimeUtc = DateTime.UtcNow.AddMinutes(1);
var bindings = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetProperty;
var value = DateTime.UtcNow.AddMinutes(1);
systemProperties.GetType().InvokeMember("EnqueuedTimeUtc", bindings, Type.DefaultBinder, systemProperties, new object[] { value});
// workaround "ThrowIfNotReceived" by setting "SequenceNumber" value
systemProperties.GetType().InvokeMember("SequenceNumber", bindings, Type.DefaultBinder, systemProperties, new object[] { 1 });
// message.systemProperties = systemProperties;
bindings = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetProperty;
message.GetType().InvokeMember("SystemProperties", bindings,Type.DefaultBinder, message, new object[] { systemProperties });
請注意 ,這種方法並非來自Azure Service Bus團隊,因為他們認為這是一種危險的實踐,最終可能會在您的生產中使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.