Azure Queue Service: la dimensione massima di un messaggio è 8KB o 64KB?

Eccoci con un altro piccolo incidente di percorso: la dimensione massima delle Azure Queue è stata portata da 8KB a 64KB dalla versione 2011-08-18 in poi. Fantastico! Un po’ più di spazio disponibile va benone, specialmente su messaggi con molti metadati da inviare.

Se però come me provate a creare un messaggio con una dimensione di 10KB usando l’SDK 1.5 (Ottobre 2011) riceverete un bell’errore.

A questo punto per capire esattamente dove fosse il problema mi sono armato di JustDecompile (visto che il buon vecchio Reflector non è più free, proviamo quello di Telerik) e ho decompilato il CloudQueueMessage da Microsoft.WindowsAzure.StorageClient.dll e… sorpresa! Nel costruttore c’è un bel limite massimo hardcoded a 8192 byte:

CloudQueueMessage.MaxMessageSize = (long)8192;

Come risolvere il problema? Scaricando la versione 1.6 dell’SDK di Azure dove le librerie client sono state aggiornate coi nuovi limiti e decompilando la stessa dll adesso si ha:

CloudQueueMessage.MaxMessageSize = (long)65536;

Azure Table Storage e l’operatore FirstOrDefault

Oggi ho perso l'intero pomeriggio a lottare contro questo problema, quindi voglio condividere la cosa in modo da evitare ad altri di spaccarsi la testa sulla stessa cosa.
Stavo eseguendo una query semplice sul Table Storage di Azure utilizzando PartitionKey e RowKey per recuperare una specifica entità in una tabella specifica (es.: http://127.0.0.1:10002/devstoreaccount1/Spaceship (PartitionKey = '380 ',RowKey = '1234 ')).
Durante i test, il primo scenario era dove non esisteva entità con PK e RK date e ho usato una semplice query che termina con l'operatore FirstOrDefault tipo:

TableRepository.FindWhere (p => p.PartitionKey == entity.Spaceship.CountryCode.ToString () & &
. p.RowKey == entity.SerialNumber) FirstOrDefault ();

e mi aspettavo u null, ma in realtà ho cominciato a ricevere errori 404 col seguente dettaglio: 

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 
  <code>ResourceNotFound</code> 
  <message xml:lang="en-US">The specified resource does not exist.</message> 
</error>
Dopo diverse ore alle prese con vari test ho scoperto queste “Perle di Saggezza Azure”:
- Internet Explorer non può essere utilizzato per eseguire query direttamente su Table Storage
- È necessario impostare IgnoreResourceNotFoundException = true nel TableServiceContext per ricevere null quando un'entità non viene trovata, invece di ricevere un errore 404