2014-12-02 57 views
2

我正在使用Azure事件中心,並且最初在發送數據以嘗試計算批量大小時,我的代碼與下面的代碼相似,將會調用EventDataGetBytes爲什麼不能在發送之前調用EventData.GetBytes()?

EventHubClient client;//initialized before the relevant code 

EventData curr = new EventData(data); 
//Setting a partition key, and other operations. 
long itemLength = curr.GetBytes().LongLength; 
client.SendAsync(curr); 

不幸的是我會在SDK代碼中收到一個異常。

消息正文不能被多次讀取。要重複使用,請在閱讀後存儲該值。

儘管最終不必要的調用GetBytes意味着我可以發送消息,但發生此異常的基本原理相當令人費解。連續調用GetBytes()兩次是重現同一異常的簡單方法,但單次調用將意味着EventData無法成功發送。

看起來有可能在Message下面使用了,如果調用Message.GetBody文檔多於一次,則設置爲拋出異常;然而,在EventData的方法GetBodyStream,GetBody w/serializer,GetBodyGetBytes中沒有這種效果的文檔。

我想這應該是記錄,或更正,因爲目前這是一個不愉快的驚喜在一個單獨的線程。

+1

大多數網絡/ IPC相關對象不支持任何類型的查找/重讀/重寫,所以這種行爲應該是有點期待的。我不知道它是否記錄在這個特定類型的任何地方。 – 2014-12-02 04:23:40

+0

這似乎是一個合理的折衷(如果有文件記錄)收到的消息,大大少於尚未發送的消息。 – cacsar 2014-12-02 05:21:40

回答

3

您是否嘗試過使用EventData.SerializedSizeInBytes來獲取大小?這是獲得批量計算大小的更準確的方法。

+0

至於你看到的GetBytes()行爲,我們會研究它。 – 2015-04-02 17:25:54

+0

http://stackoverflow.com/questions/27263189/how-can-the-serialized-size-of-eventdata-be-determined-for-batching是我的那個問題。這個問題(和那個)早於SerializedSizeInBytes。 – cacsar 2015-04-02 20:04:34

+0

謝謝你讓我知道。順便說一句,GetBytes()行爲應該在Nuget build 2.6.5中修復https://www.nuget.org/packages/WindowsAzure.ServiceBus/2.6.5 – 2015-04-13 22:47:39

相關問題