La mia comprensione era che Azure CloudAppendBlob era al riparo da problemi di concorrenza in quanto è possibile solo aggiungere a questo storage BLOB e non è necessario confrontare E-tag. Come affermato da questo post:Errori Azure CloudAppendBlob con accesso simultaneo
specificamente:
Inoltre, aggiungere Blob supporta avere più clienti che scrivono allo stesso blob senza necessità di sincronizzazione (a differenza di blocco e pagina blob)
Tuttavia il seguente test dell'unità solleva:
412 la condizione di posizione aggiunta specificata non è stata soddisfatta.
dello stack trace
Microsoft.WindowsAzure.Storage.Blob.BlobWriteStream.Flush()
Microsoft.WindowsAzure.Storage.Blob.BlobWriteStream.Commit()
Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.UploadFromStreamHelper
Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.AppendFromStream
Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.AppendFromByteArray
Microsoft.WindowsAzure.Storage.Blob.CloudAppendBlob.AppendText
Ecco il test di unità. Forse il servizio gestirà le richieste da diversi contesti ma non come questo come un parallelo?
[TestMethod]
public void test_append_text_concurrency()
{
AppendBlobStorage abs = new AppendBlobStorage(new TestConnectConfig(), "testappendblob");
string filename = "test-concurrent-blob";
abs.Delete(filename);
Parallel.Invoke(
() => { abs.AppendText(filename, "message1\r\n"); },
() => { abs.AppendText(filename, "message2\r\n"); }
);
string text = abs.ReadText(filename);
Assert.IsTrue(text.Contains("message1"));
Assert.IsTrue(text.Contains("message2"));
}
Metodo AppendBlobStorage
public void AppendText(string filename, string text)
{
CloudAppendBlob cab = m_BlobStorage.BlobContainer.GetAppendBlobReference(filename);
// Create if it doesn't exist
if (!cab.Exists())
{
try
{
cab.CreateOrReplace(AccessCondition.GenerateIfNotExistsCondition(), null, null);
}
catch { }
}
// Append the text
cab.AppendText(text);
}
forse mi manca qualcosa. Il motivo per cui sto cercando di farlo è che ho più lavori Web che possono tutti scrivere su questo blob di append e ho pensato che fosse per cosa fosse progettato?
Ho anche appena provato questo da girare su più webjobs e scrivere del testo per lo stesso appendblob. Ho fatto lo stesso errore. – James
Nota che sto usando la versione 5.0.2.0 di Microsoft.WindowsAzure.Storage (ho anche provato contro l'anteprima 5.0.3.0) – James