从 azure storage mvc 中删除 Blob

Posted

技术标签:

【中文标题】从 azure storage mvc 中删除 Blob【英文标题】:Deleting Blobs from azure storage mvc 【发布时间】:2017-08-22 01:19:03 【问题描述】:

尝试从我的 Azure 存储中删除或复制 blob 时,在成功上传后,我收到以下 404 错误。由于成功上传和成功下载,我不明白为什么它没有从我的存储系统中找到 blob。这是我要删除的代码不起作用; 我尝试设置“ CloudBlockBlob blob = container.GetBlockBlobReference(path); ” 到一个我知道那里的文件“2020Resume.pdf”,但它仍然没有工作

// GET: DocumentUps/Delete/5
        public ActionResult Delete(int? id)
        
            if (id == null)
            
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            
            DocumentUps documentUps = db.DocumentUps.Find(id);
            Distributee distributees = db.Distributees.Find(id);
            if (documentUps == null)
            
                return HttpNotFound();
            
            return View(documentUps);
        

        // POST: DocumentUps/Delete/5
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(int id)
    
        DocumentUps documentUps = db.DocumentUps.Find(id);
        Distributee distributees = db.Distributees.Find(id);


        string attachmnt = documentUps.Attachment.ToString();
        if (attachmnt.Contains('.'))
            attachmnt = attachmnt.Substring(0, attachmnt.LastIndexOf('.'));

        var fileName = documentUps.DocumentId.ToString() + documentUps.RevisionId.ToString() + attachmnt;

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("filestorageideagen_AzureStorageConnectionString"));
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference("documentuploader");
        CloudBlockBlob blob = container.GetBlockBlobReference(fileName);
        blob.Delete();


        if (distributees != null)
        
            db.Distributees.Remove(distributees);
        
        db.DocumentUps.Remove(documentUps);
        db.SaveChanges();

        return RedirectToAction("Index");
    

错误

Server Error in '/' Application.

The remote server returned an error: (404) Not Found.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Net.WebException: The remote server returned an error: (404) Not Found.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[WebException: The remote server returned an error: (404) Not Found.]
   System.Net.HttpWebRequest.GetResponse() +1399
   Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync(RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) +1150

[StorageException: The remote server returned an error: (404) Not Found.]
   Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync(RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) +4559
   Microsoft.WindowsAzure.Storage.Blob.CloudBlob.Delete(DeleteSnapshotsOption deleteSnapshotsOption, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) +62
   Integrated_Project.Controllers.MyDocumentUpsController.DeleteConfirmed(Int32 id) +336
   lambda_method(Closure , ControllerBase , Object[] ) +97
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +157
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22
   System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
   System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9765121
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

【问题讨论】:

【参考方案1】:

您创建CloudBlockBlob 实例的方式存在问题。 path 应该只包含文件名而不是完整的 URL,因为 URL 将由 SDK 自动创建。因此,如果您只执行以下操作,错误应该会消失:

            string path = "https://filestorageideagen.blob.core.windows.net/documentuploader/" + fileName;


            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("filestorageideagen_AzureStorageConnectionString"));
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("documentuploader");
            CloudBlockBlob blob = container.GetBlockBlobReference(fileName);//Changed path to fileName
            blob.Delete();

【讨论】:

【参考方案2】:

GetBlockBlobReference 的参数是 blob 名称。所以请尝试使用 blob 名称而不是路径。

CloudBlockBlob blob = container.GetBlockBlobReference(fileName);

【讨论】:

请查看此链接@TerryFei,它的屏幕截图显示了所需的确切名称,但仍然出现错误。似乎让它工作的唯一方法是手动输入确切的文件名gyazo.com/5cb43242be8e8fbb37c0e22aedf843b5 根据你的截图,类型是XML。我假设您的 blob 名称是 4747userSettings.xml。请在您的本地机器上取消选中Hide extensions for known file types并重新检查,更多详细信息请参考document。【参考方案3】:

原来错误是在数据库查询中,我的修订 ID 被更改为 0 并且在某个时间点并且没有搜索正确的文件

【讨论】:

以上是关于从 azure storage mvc 中删除 Blob的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure 文件共享下载和删除文件

使用 azure-storage-blob 或 azure-storage 上传和删除 Azure 存储 Blob

Azure IoT Hub 十分钟入门系列 - 实现从设备上传日志文件/图片到 Azure Storage

C#:使用 Azure.Storage.Blobs 客户端库将 blob 从一个容器移动到另一个容器

如何从适用于 Node.js 的 Azure blob v12 SDK 中删除 blob

如何在说 x 天后定期从 azure 文件共享中删除文件?