从azure存储mvc中删除Blob

时间:2017-03-28 19:43:23

标签: asp.net azure model-view-controller azure-storage

尝试从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

3 个答案:

答案 0 :(得分:4)

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

            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();

答案 1 :(得分:3)

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

def user_request(): order = input("What would you like to do P | A | N | L | M | Q \n") while True: if order == 'P': aPrint() elif order == 'A': useradd = input("what would you like to add to the queue?") aAdd(useradd) elif order == 'N': bList = (aRemove(aList)) elif order == 'L': bList = (aLeave(aList,input("What would you like to remove from the queue?"))) elif order == 'M': aLocation() elif order == 'Q': aQuit()

答案 2 :(得分:0)

结果是数据库查询中的错误,我的修订版ID被更改为0并且某些点并没有搜索到正确的文件