C# 在c中从Windows azure删除blob#

C# 在c中从Windows azure删除blob#,c#,windows-phone-8,azure-storage,azure-storage-blobs,C#,Windows Phone 8,Azure Storage,Azure Storage Blobs,我有一些代码,可以将一个blob插入到存储器中,并允许用户查看blob列表和单个blob。但是,我现在无法删除blob,出现的错误是 “System.ServiceModel.ni.dll中发生'System.ServiceModel.FaultException'1'类型的异常,但未在用户代码中处理。其他信息:远程服务器返回错误:(404)未找到。” WCF服务中的代码是 public void DeleteBlob(string guid, string uri) { //creat

我有一些代码,可以将一个blob插入到存储器中,并允许用户查看blob列表和单个blob。但是,我现在无法删除blob,出现的错误是

“System.ServiceModel.ni.dll中发生'System.ServiceModel.FaultException'1'类型的异常,但未在用户代码中处理。其他信息:远程服务器返回错误:(404)未找到。”

WCF服务中的代码是

public void DeleteBlob(string guid, string uri)
{
    //create the storage account with shared access key
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(accountDetails);

    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference(guid);

    CloudBlockBlob blob = container.GetBlockBlobReference(uri);
    blob.DeleteIfExists();
}
然后我通过SOAP服务在移动客户端应用程序中访问它,如:

private void mnuDelete_Click(object sender, EventArgs e)
{
    MessageBoxResult message = MessageBox.Show("Are you sure you want to delete this image?", "Delete", MessageBoxButton.OKCancel);
    if (message == MessageBoxResult.OK)
    {
        Service1Client svc = new Service1Client();
        svc.DeleteBlobCompleted += new EventHandler<AsyncCompletedEventArgs>(svc_DeleteBlobCompleted);
        svc.DeleteBlobAsync(container, uri);
    }
}
void svc_DeleteBlobCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (e.Error == null) {
        NavigationService.Navigate(new Uri("/Pages/albums.xaml", UriKind.Relative));
    }
    else {
        MessageBox.Show("Unable to delete this photo at this time", "Error", MessageBoxButton.OK);
    }
}
private void mnuDelete\u单击(对象发送方,事件参数e)
{
MessageBoxResult message=MessageBox.Show(“您确定要删除此图像吗?”,“删除”,MessageBoxButton.ok取消);
if(message==MessageBoxResult.OK)
{
Service1Client svc=新Service1Client();
svc.DeleteBlobCompleted+=新事件处理程序(svc_DeleteBlobCompleted);
DeleteBlobAsync(容器,uri);
}
}
void svc_DeleteBlobCompleted(对象发送方,AsyncCompletedEventArgs e)
{
如果(e.Error==null){
NavigationService.Navigate(新Uri(“/Pages/albums.xaml”,UriKind.Relative));
}
否则{
MessageBox.Show(“此时无法删除此照片”,“错误”,MessageBox按钮。确定);
}
}

首先,我还使用SAS令牌来保存blob—我不知道这是否有区别?

在Azure Storage Client Library 4.0中,我们将Get*引用方法更改为仅接受相对地址。因此,如果您使用的是最新的库,并且参数“uri”是一个绝对地址,那么应该将其更改为blob名称,或者应该使用接受uri和对象的


请在我们的中查看所有这些突破性的更改。

我正在ASP.NET核心MVC web应用程序(v1.1.3)中使用WindowsAzure.Storage(v8.1.4)

我的web应用上有一个图像裁剪和调整大小功能,所以我决定使用Azure Blob存储来存储原始(用户上传)图片和裁剪(调整大小后)图片

即使您使用带有绝对uri的
CloudBlockBlob
构造函数,也要记住一件重要的事情,那就是您仍然需要将存储帐户凭据传递到
CloudBlockBlob
构造函数中

public class AzureBlobStorageService : IBlobStorageService
{
    private readonly AzureBlobConnectionConfigurations _azureBlobConnectionOptions;
    private readonly CloudStorageAccount _storageAccount;
    private readonly CloudBlobClient _blobClient;

    public AzureBlobStorageService(IOptions<AzureBlobConnectionConfigurations> azureBlobConnectionAccessor)
    {
        _azureBlobConnectionOptions = azureBlobConnectionAccessor.Value;

        _storageAccount = CloudStorageAccount.Parse(_azureBlobConnectionOptions.StorageConnectionString);
        _blobClient = _storageAccount.CreateCloudBlobClient();
    }

    public async Task<Uri> UploadAsync(string containerName, string blobName, IFormFile image)
    {
        ...
    }

    public async Task<Uri> UploadAsync(string containerName, string blobName, byte[] imageBytes)
    {
        ...
    }

    public async Task<byte[]> GetBlobByUrlAsync(string url, bool deleteAfterFetch = false)
    {
        // This works
        var blockBlob = new CloudBlockBlob(new Uri(url), _storageAccount.Credentials);

        // Even this will fail
        //var blockBlob = new CloudBlockBlob(new Uri(url));

        await blockBlob.FetchAttributesAsync();

        byte[] arr = new byte[blockBlob.Properties.Length];
        await blockBlob.DownloadToByteArrayAsync(arr, 0);

        if (deleteAfterFetch)
        {
            await blockBlob.DeleteIfExistsAsync();
        }

        return arr;
    }

    private async Task<CloudBlobContainer> CreateContainerIfNotExistAsync(string containerName)
    {
        var container = _blobClient.GetContainerReference(containerName);
        if (!await container.ExistsAsync())
        {
            await container.CreateAsync();
            await container.SetPermissionsAsync(new BlobContainerPermissions
            {
                PublicAccess = BlobContainerPublicAccessType.Blob
            });
        }

        return container;
    }
}
公共类AzureBlobStorageService:IBlobStorageService
{
专用只读AzureBlobConnectionConfiguration _azureBlobConnectionOptions;
私有只读CloudStorageAccount\u storageAccount;
私有只读CloudBlobClient\u blobClient;
公共AzureBlobStorageService(IOptions azureBlobConnectionAccessor)
{
_azureBlobConnectionOptions=azureBlobConnectionAccessor.Value;
_storageAccount=CloudStorageAccount.Parse(_azureBlobConnectionOptions.StorageConnectionString);
_blobClient=\u storageAccount.CreateCloudBlobClient();
}
公共异步任务UploadAsync(字符串containerName、字符串blobName、文件映像)
{
...
}
公共异步任务UploadAsync(字符串containerName、字符串blobName、字节[]imageBytes)
{
...
}
公共异步任务GetBlobByUrlAsync(字符串url,bool deleteAfterFetch=false)
{
//这很有效
var blockBlob=newcloudblockblob(新Uri(url),\u storageAccount.Credentials);
//即使这样也会失败
//var blockBlob=newcloudblockblob(新Uri(url));
等待blockBlob.FetchAttributesAsync();
byte[]arr=新字节[blockBlob.Properties.Length];
等待blockBlob.downloadtobytearayasync(arr,0);
if(deleteAfterFetch)
{
等待blockBlob.DeleteIfExistsAsync();
}
返回arr;
}
专用异步任务CreateContainerIfNotExistAsync(字符串containerName)
{
var container=_blobClient.GetContainerReference(containerName);
如果(!wait container.ExistsAsync())
{
wait container.CreateAsync();
等待容器.SetPermissionsAsync(新BlobContainerPermissions
{
PublicAccess=BlobContainerPublicAccessType.Blob
});
}
返回容器;
}
}

希望这能有所帮助。

在Azure存储客户端库4.0中,必须更改获取引用方法以接受相对地址,而不接受其他内容。因此,这不支持在此之前的库


您应该将其更改为blob名称,或者使用接受Uri和StorageCredentials对象的CloudBlockBlob构造函数。

谢谢,我从blob名称中删除了它,它可以正常工作。@RavitD不会再指望Microsoft提供更多信息,您认为此网站为什么存在?所有链接都已过期。如果有帮助,确保您的SASToken字符串正确。我使用了错误的值(连接字符串),它允许您从错误的字符串创建StorageCredentials对象-它不会抱怨,除非您尝试删除时会得到404(而不是禁止)。一旦我意识到并更改为正确的字符串,我的代码就可以正常工作了。