从天蓝色函数读取blob的内容

时间:2019-08-02 19:17:47

标签: azure azure-functions azure-blob-storage azure-function-async

我正在尝试读取azure函数中blob的内容。

代码如下:

注意: 如果我注释掉using块并返回blob,即

返回新的OkObjectResult(blob);

我拿回了blob对象。

但是,如果我使用using块,我将得到500。

知道为什么我无法获得内容吗?

string storageConnectionString = "myConnectionString";
CloudStorageAccount storageAccount;
CloudStorageAccount.TryParse(storageConnectionString, out storageAccount);
CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = cloudBlobClient.GetContainerReference("drawcontainer");


var blob = drawingsContainer.GetBlockBlobReference("notes.txt");

using (StreamReader reader = new StreamReader(blob.OpenRead()))
{
    content = reader.ReadToEnd();
}
return new OkObjectResult(content);

2 个答案:

答案 0 :(得分:1)

HTTP 500指示代码有错误。错误的最可能原因是变量“ 内容”。在using块外定义变量' content ',因为在其中定义的content变量的范围仅限于该块。在using块外声明它,如下所示:

    try
    {
        string content = string.Empty;
        using (StreamReader reader = new StreamReader(blob.OpenRead()))
        {
            content = reader.ReadToEnd();
        }
    }
    catch (Exception ex)
    {
        // Log exception to get the details.    
    }

始终使用try catch获得有关代码错误的更多详细信息。

答案 1 :(得分:1)

OpenRead方法不存在,所以我使用了异步方法并解决了它。

在VS中创建了一个Azure函数并发布它之后,我便获得了这种解决方案。

这是我使用的代码:

 public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<ActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
    {
        log.Info("C# HTTP trigger function processed a request.");
        string storageConnectionString = "DefaultEndpointsProtocol=https;AccountName=avitest19a1c;AccountKey=<AccessKey>";
        CloudStorageAccount storageAccount = null;
        CloudStorageAccount.TryParse(storageConnectionString, out storageAccount);
        CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer drawingsContainer = cloudBlobClient.GetContainerReference("drawcontainer");

        var blob = drawingsContainer.GetBlockBlobReference("notes.txt");

        string content = string.Empty;
        **var contentStream = await blob.OpenReadAsync();**
        using (StreamReader reader = new StreamReader(contentStream))
        {
            content = reader.ReadToEnd();
        }

        return new OkObjectResult(content);

    }
}