2017-12-11 11 views
0

手動でMicrosoft.Azure.ServiceBus.Messageを作成してJSONにシリアル化するテストを作成する必要があります。コード例:Azure ServiceBusメッセージをシリアル化できません - 「ExpiresAtUtc」から値を取得中にエラーが発生しました

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は取得できないため、直接設定することはできません。それを間接的に設定する方法はありますか?

答えて

1

ExpiresAtUtcは、ブローカーによって設定され、内部(SystemPropertiesコレクション)と見なされ、そのように意図的に設計されています。テストについてはsimilar questionがありました。本当に必要な場合は、これを達成する唯一の方法はリフレクションを使用することでした。

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のサービスバスのチームから来ていないことに注意してください

+0

リフレクションを使わずにメッセージを設定するよりエレガントな方法があると思っていましたが、十分に公正ではない場合は:-) – nashwan

+0

クレメンスは正しいものがコントロールできなくなると言って正しい方法です。繊細なバランスです。 –

関連する問題