Я пытаюсь загрузить файлы из локального клиента командной строки в Azure storage через web-api. Я использую для этого веб-сайт Azure. Работа с клиентом не является проблемой. И у меня все работает нормально. Вот код веб-апи:Загружайте файлы в хранилище Azure Blob через WebApi без доступа к локальной файловой системе
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);
}
Все отлично работает, когда я бегу на месте, но, как только я раскрываю веб-сайт в лазури, я не могу загрузить, потому что Azure Web-сайты не имеют доступ к LocalResource. И мне нужно переключиться на Azure Web-Role. Я могу переключиться, но доступ к локальной файловой системе беспокоит меня все вместе.
И LocalResource требуется, например, для MultipartFormDataStreamProvider(). И я не нашел альтернативных способов загрузки файлов в WebApi. Мой план состоял в channel through upload directly to Azure, не сохраняя ничего на локальном жестком диске.
Есть ли способ загрузить файлы?
p.s. Я видел usages of Shared Access Signatures, где я могу предоставить клиентскому приложению URL-адрес с подписью и позволить клиенту загружать непосредственно в Azure Blog. Но я не уверен, насколько это безопасно и не очень удобно (пока) с передачей подписей к клиенту. В настоящий момент я предполагаю, что клиент будет запущен в очень агрессивной среде, и ничто не может быть доверено возвращаться от клиента.
UPD Мое окончательное решение связано с использованием только единой сигнатуры доступа, выданной на сервере и передаваемой клиенту. Затем клиент загружает файлы непосредственно в Azure. Таким образом, я сохраняю много хлопот с управлением загруженными файлами. И вот more detailed description моего решения.
Какое исключение выбрасывает следующий код "localResource = RoleEnvironment.GetLocalResource (" TempStorage ")" –
Вы удобно используете REST API? –
@BrianDishaw Исключение составляет нечто вроде строк «Невозможно получить LocalResource, System.Runtime.InteropServices.SEHException (0x80004005): внешний компонент выбрал исключение ». Также эта страница (http://msdn.microsoft.com/en-us/library/windowsazure/ee758708.aspx) предполагает, что локальные ресурсы предназначены только для веб- и Рабочие роли, а не веб-сайты. – trailmax