簡體   English   中英

Azure 使用標簽的 blob 存儲搜索 c#

[英]Azure blob storage search using tags c#

我將圖像存儲在 Azure blob 存儲中,我需要能夠使用標簽而不是名稱在容器中搜索特定文件。

這是我的連接字符串:

<add key="blobConnString" value="DefaultEndpointsProtocol=https;AccountName=XXXX;AccountKey=XXXXXXXXXXXX;EndpointSuffix=core.windows.net"/>

這是我的方法:

private void FindFiles()
{
    var foundItems = new List<TaggedBlobItem>();
    var connectionString = ConfigurationManager.AppSettings["blobConnString"];
    var _client = new BlobServiceClient(connectionString);
    var blobs = _client.FindBlobsByTags("@container = 'images' AND 'invID' = '12345'");
    foreach (var blob in blobs)
    {
        foundItems.Add(blob);
    }
}

這是我得到的錯誤:

Error: Azure.RequestFailedException: Value for one of the query parameters specified in the request URI is invalid.
RequestId:7434f0b1-501e-0001-07a5-4ef3e1000000
Time:2022-04-12T19:45:01.1081429Z
Status: 400 (Value for one of the query parameters specified in the request URI is invalid.)
ErrorCode: InvalidQueryParameterValue

Additional Information:
QueryParameterName: comp
QueryParameterValue: blobs
Reason:

Content:
<?xml version="1.0" encoding="utf-8"?><Error><Code>InvalidQueryParameterValue</Code><Message>Value for one of the query parameters specified in the request URI is invalid.
RequestId:7434f0b1-501e-0001-07a5-4ef3e1000000
Time:2022-04-12T19:45:01.1081429Z</Message><QueryParameterName>comp</QueryParameterName><QueryParameterValue>blobs</QueryParameterValue><Reason /></Error>

Headers:
Server: Microsoft-HTTPAPI/2.0
x-ms-request-id: 7434f0b1-501e-0001-07a5-4ef3e1000000
x-ms-client-request-id: c522b1bc-ce28-4c48-a593-dfbb6d81af66
x-ms-error-code: InvalidQueryParameterValue
Date: Tue, 12 Apr 2022 19:45:00 GMT
Content-Length: 376
Content-Type: application/xml

   at Azure.Storage.Blobs.ServiceRestClient.FilterBlobs(Nullable`1 timeout, String where, String marker, Nullable`1 maxresults, CancellationToken cancellationToken)
   at Azure.Storage.Blobs.BlobServiceClient.FindBlobsByTagsInternal(String marker, String expression, Nullable`1 pageSizeHint, Boolean async, CancellationToken cancellationToken)
   at Azure.Storage.Blobs.Models.FilterBlobsAsyncCollection.GetNextPageAsync(String continuationToken, Nullable`1 pageSizeHint, Boolean async, CancellationToken cancellationToken)
   at Azure.Core.Pipeline.TaskExtensions.EnsureCompleted[T](ValueTask`1 task)
   at Azure.Storage.StorageCollectionEnumerator`1.StoragePageable.GetEnumerator()+MoveNext()
   at CosmosGettingStartedTutorial.Program.FindFiles() in C:\Users\Drew\Downloads\DocumentDB-Quickstart-DotNet\sql-dotnet\CosmosGettingStartedTutorial\Program.cs:line 297
   at CosmosGettingStartedTutorial.Program.GetStartedDemoAsync() in C:\Users\Drew\Downloads\DocumentDB-Quickstart-DotNet\sql-dotnet\CosmosGettingStartedTutorial\Program.cs:line 78
   at CosmosGettingStartedTutorial.Program.Main(String[] args) in C:\Users\Drew\Downloads\DocumentDB-Quickstart-DotNet\sql-dotnet\CosmosGettingStartedTutorial\Program.cs:line 45
End of demo, press any key to exit.

更新此方法用於檢索我的 blob:

var connectionString = ConfigurationManager.AppSettings["blobConnString"];
        var blobContainer = new BlobContainerClient(connectionString, "images");
        var blobs = new List<string>();
        await foreach (var blob in blobContainer.GetBlobsAsync())
        {
            blobs.Add(blob.Name);
        }

        foreach (var blob in blobs)
        {
            Console.WriteLine(blob);
        }

但是,這段代碼不起作用並繼續逐字拋出上述錯誤:

var blobClent = new BlobServiceClient(connectionString);
        var foundItems = blobClent.FindBlobsByTags("invID = '12345'").ToList();
        foreach (var blob in foundItems)
        {
            Console.WriteLine(blob.BlobName + " from " + blob.BlobContainerName);
        }

第二部分是引發錯誤的原因。 Azure 中的服務帳戶有問題嗎? 我是否缺少 Azure 設置(即使我可以正確閱讀)?

從我們這邊重現后,我們觀察到這是由於無效的tagFilterSqlExpression的。 下面是對我們有用的代碼。

從所有容器中檢索 blob

string ConnectionString = "DefaultEndpointsProtocol=https;AccountName=<Your_Account_Name>;AccountKey=<Your_Account_Key>;EndpointSuffix=core.windows.net";
BlobServiceClient blobServiceClient = new BlobServiceClient(ConnectionString);

var foundItems = new List<TaggedBlobItem>();

foreach (TaggedBlobItem blob in client.FindBlobsByTags("invID = '12345'"))
{
    foundItems.Add(blob);
}

foreach(var blob in foundItems)
{
    Console.WriteLine(blob.BlobName+" from "+blob.BlobContainerName);
}

結果:

在此處輸入圖像描述

從特定容器中檢索 blob

string ConnectionString = "DefaultEndpointsProtocol=https;AccountName=<Your_Account_Name>;AccountKey=<Your_Account_Key>;EndpointSuffix=core.windows.net";
BlobServiceClient blobServiceClient = new BlobServiceClient(ConnectionString);

var foundItems = new List<TaggedBlobItem>();

foreach (TaggedBlobItem blob in client.FindBlobsByTags("@container = 'container1' AND invID = '12345'"))
{
    foundItems.Add(blob);
}

foreach(var blob in foundItems)
{
    Console.WriteLine(blob.BlobName);
}

結果:

在此處輸入圖像描述

問題是 Azure 中存儲帳戶的設置。分層命名空間導致了整個問題......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM