2017-01-11 5 views
1

Я столкнулся с ситуацией, когда я не могу выполнять определенные операции, такие как удаление blob внутри контейнера в моей учетной записи хранилища. Я просматривал эти форумы и пробовал различные потенциальные решения, такие как предоставление правильного разрешения или создание токена SAS. Мне не удалось заставить его работать, поэтому я также связался с Azure Support, но мне не удалось получить помощь, в которой я нуждался.Невозможно удалить, загрузить и загрузить blob в Azure Cloud Storage

Я работаю над веб-приложением .NET, которое, когда пользователь входит в систему, перечисляет свои сохраненные blob и дает им возможность загружать их файлы или загружать новые или даже удалять. Я могу получить и отобразить правильные капли без проблем. Когда я пытаюсь удалить или загрузить, я сталкиваюсь с этой проблемой: «Ресурс, который вы ищете, был удален, изменилось его имя или временно недоступно».

Вот отрывок из моего кода

public static void init(string username){ 
     // Retrieve storage account from connection string. 
     storageAccount = CloudStorageAccount.Parse(
      CloudConfigurationManager.GetSetting("StorageConnectionString")); 

     // Create the blob client. 
     blobClient = storageAccount.CreateCloudBlobClient(); 

     // Retrieve a reference to a container. 
     container = blobClient.GetContainerReference(username); 

     // Create the container if it doesn't already exist. 
     container.CreateIfNotExists(); 

     BlobContainerPermissions permissions = new BlobContainerPermissions(); 
     permissions.PublicAccess = BlobContainerPublicAccessType.Blob; 

     // The new shared access policy provides read/write access to the container for 24 hours. 
     permissions.SharedAccessPolicies.Add("mypolicy", new SharedAccessBlobPolicy(){ 
      // To ensure SAS is valid immediately, don’t set the start time. 
      // This way, you can avoid failures caused by small clock differences. 
      SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24), 
      Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Create | SharedAccessBlobPermissions.Add | SharedAccessBlobPermissions.Delete 
     }); 

     // Set the new stored access policy on the container. 
     container.SetPermissions(permissions); 
    }//init 

    public static void deleteBlob(string name){ 
     CloudBlockBlob blob = container.GetBlockBlobReference(name); 
     blob.Delete(); 
    }//delete 

Я убедился, что строковые значения представляют собой правильные контейнеры и сгустки.

Я также попытался вставить какой-то MIME в мой файл web.config

<staticContent> 
    <mimeMap fileExtension=".txt" mimeType="text/plain"/> 
    <mimeMap fileExtension=".jpg" mimeType="image/jpeg"/> 
</staticContent> 

Спасибо заранее.

EDIT: Вот как метод выглядит в моем контроллере

public ActionResult Delete(string name) { 
    StorageModel.deleteBlob(name); 
    return View(refreshList()); 
}//delete 

А вот как это выглядит на моем cshtml

@Html.ActionLink("Delete", "Delete", new { id=item.name }) 
+0

Просьба включить сегмент кода, в котором используются методы Azure blob. Исходя из этой ошибки, вы, вероятно, используете веб-Api, и маршрут не настроен должным образом. – Ankit

+0

@Ankit Отредактировано и добавлено код, связанный с контроллером и cshtml-файлом. –

+0

Можете ли вы попытаться получить URL-адрес blob в методе deleteBlob и посмотреть, пытаетесь ли вы удалить правильный blob. –

ответ

0

Даже если вы пометить это, как правильный ответ я говорю вы, что вы перепутали ООП.

  • убедитесь, что вы Buiding corectly в конструкторе вашей учетной записи для хранения и ваш блоб имя контейнера (метод инициализации твоего с именем пользователя в качестве параметра ведьма на самом деле это имя контейнера)
  • ваш метод инициализации является статическим, я м 100% уверен, что вы tryng удалить файл из неправильного контейнера, имя контейнера можно чередовать с другой StorageModel.init («some_container»)
  • поэтому убедитесь, что вы находитесь в правильном контейнере
  • перед удалением или что бы вы ни делали, проверьте, существует ли файл

    public static bool FileExists(string fileName, out int errorCode) 
    { 
        try 
        { 
         errorCode = ErrorCode.SUCCESS; 
         return container.ListBlobs(fileName, true).Any(); 
        } 
        catch (Exception) //TODO: treat/log exception 
        { 
         errorCode = ErrorCode.ERROR_LOOKING_FOR_FILE; 
        } 
        return false; 
    } 
    

называют это штуковина здесь:

public static void deleteBlob(string name){ 
    //exist file 
    int errCode = 0; 
    if (FileExists(name, out errCode)) 
    { 
      CloudBlockBlob blob = container.GetBlockBlobReference(name); 
      blob.Delete(); 
      return; 
    } 
    //do something if error 
} 

Но самая большая проблема ваша в том, что статический объект StorageModel, даже это то, что вы ищете, и решить эту проблему , это не правильный способ сделать это

public ActionResult Delete(string name) { 
    StorageModel.Init("Correct Container Name") 
    StorageModel.deleteBlob(name); 
    return View(refreshList()); 
} 
+0

Это небольшой проект, не предназначенный для реальных сценариев жизни, и моя учетная запись Azure очень ограничена. Потенциальные «посетители» должны совместно использовать одну учетную запись, контейнер и файлы хранилища. Я уверен, что я не вношу неправильные имена файлов или имена контейнеров, так как я могу вернуться и отобразить их для пользователя. –

+0

ОК, удачи с этим – SilentTremor