Sto provando a caricare i file dal client della riga di comando locale nell'archiviazione di Azure tramite web-api. Sto utilizzando il sito Web di Azure per questo. Lavorare con il cliente non è un problema. E ho tutto a posto a livello locale bene. Ecco il codice web-API:Carica i file nello storage Azure Blob tramite WebApi senza accedere al filesystem locale
public async Task<HttpResponseMessage> PostUpload()
{
// need a local resource to store uploaded files temporarily
LocalResource localResource = null;
try
{
// Azure web-site fails here
localResource = RoleEnvironment.GetLocalResource("TempStorage");
}
catch (Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to get access to local resources");
}
var provider = new MultipartFormDataStreamProvider(localResource.RootPath);
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
// snipped validation code
var container = // code to get container
foreach (var fileData in provider.FileData)
{
var filename = GetBlobName(fileData);
var blob = container.GetBlockBlobReference(filename);
using (var filestream = File.OpenRead(fileData.LocalFileName))
{
blob.UploadFromStream(filestream);
}
File.Delete(fileData.LocalFileName);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
Tutto funziona bene quando ho eseguito a livello locale, ma non appena mi schiero sito web in Azure, non riesco a caricare, a causa Azure siti web non hanno accesso a LocalResource. E ho bisogno di passare al ruolo Web di Azure. Posso passare, ma l'accesso al file system locale mi dà fastidio tutti insieme.
E LocalResource è necessario, ad esempio, per MultipartFormDataStreamProvider(). E non ho trovato modi alternativi per caricare file su WebApi. Il mio piano era di channel through upload directly to Azure, senza memorizzare nulla su un HDD locale.
C'è un altro modo per caricare file?
p.s. Ho visto usages of Shared Access Signatures dove posso dare un URL dell'applicazione client con la firma e lasciare che il client carichi direttamente sul blog di Azure. Ma non sono sicuro di quanto sarà sicuro e non molto comodo (ancora) con il passaggio delle firme al cliente. Al momento presumo che il client verrà eseguito in un ambiente molto ostile e non ci si può fidare di nulla che ritorni dal client.
UPD La mia soluzione finale riguardava l'utilizzo della firma di accesso condiviso di sola scrittura rilasciata sul server e trasmessa al client. Il client quindi carica i file direttamente in Azure. In questo modo risparmi un sacco di problemi con la gestione dei file caricati. Ed ecco more detailed description della mia soluzione.
Quale eccezione viene lanciata dal seguente codice "localResource = RoleEnvironment.GetLocalResource (" TempStorage ")" –
è comodo utilizzare l'API REST? –
@BrianDishaw L'eccezione è qualcosa sulla falsariga di "Impossibile acquisire LocalResource, System.Runtime.InteropServices.SEHException (0x80004005): il componente esterno ha generato un'eccezione. "Anche questa pagina (http://msdn.microsoft.com/en-us/library/windowsazure/ee758708.aspx) suggerisce che le risorse locali sono solo per Web e Ruolo di lavoro, non per i siti Web. – trailmax