当前位置: 首页 > 知识库问答 >
问题:

Azure: 无法从 Azure 函数 HttpTrigger 读取 Blob 文本(400 - 错误请求错误)

晏晨朗
2023-03-14

我在Azure (blob)存储上读取Blob中存储的文本时遇到问题。

blob只包含单行文本(字符串)。blob通过Azure Functions HttpTrigger (C#)填充文本,HttpTrigger通过POST接收文本,并用用户指定的名称将文本保存到blob中。保存blob时,名称全部转换为小写。

然后,用户可以访问一个简单的超文本标记语言网页,并在表单中输入blob的名称。当用户单击超文本标记语言表单上的“提交”时,将针对不同的Azure Function API执行POST。此函数访问blob并从中读取文本。每当我在Azure Functions中或使用Postman测试Function时,它都可以正常工作(我得到blob文本)。

当我尝试使用网页与 API 交互时,当 Azure 函数从 blob 读取时,我收到“400 - 错误请求”。请参阅以下详细信息:

来自Postman的API工作正常的日志:

2017-04-11T20:19:14.340 功能启动 (Id=ea82f5c6-4345-40cc-90a5-1cb1cad78b7b)

2017-04-11T20:19:14.340 C# HTTP触发器函数处理了一个请求。

2017-04-11T20:19:14.340来自POST的数据:blobName=TestBlob1submit=SubmitButtonText

2017-04-11T20:19:14.340 Blob名称为:testblob1

2017-04-11T20:19:14.340访问Azure存储帐户。

2017-04-11T20:19:14.402 Blob中的文本:你好,世界测试!

2017-04-11T20:19:14.402功能完成(成功,Id=ea82f5c6-4345-40cc-90a5-1cb1cad78b7b)

API未通过超文本标记语言形式工作的日志:

2017-04-11T20:19:52.594功能启动(Id = 1 B1 a39 b 6-0ab 8-4673-bbf 0-AE 0006 f 7 f 7 cf)

2017-04-11T20:19:52.594 C#HTTP触发器函数处理了一个请求。

2017-04-11T20:19:52.594来自POST的数据:bloName=TestBlo1

提交=检索Blob文本

2017-04-11T20:19:52.594 Blob名称为:testblob1

2017-04-11T20:19:52.594正在访问Azure存储帐户。

2017-04-11T20:19:52.626功能完成(失败,Id=1b1a39b6-0ab8-4673-bbf0-ae0006f7f7cf)

2017-04-11T20:19:52.672 执行函数时出现异常:Functions.Austin-SteelThread-HttpTrigger-DisplayBlobText.Microsoft.WindowsAzure.Storage: 远程服务器返回错误: (400) 错误的请求。

下面是讨论中的Azure函数:

#r "Microsoft.WindowsAzure.Storage"
using System;
using System.IO;
using System.Net;
using System.Text;
using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, Binder binder)
{
    log.Info("C# HTTP trigger function processed a request.");

    // Get text passed in POST
    string postData = await req.Content.ReadAsStringAsync();
    log.Info("Data from POST: " + postData);

    // Format blobName string to remove unwanted text
    // Help from http://stackoverflow.com/questions/9505400/extract-part-of-a-string-between-point-a-and-b
    int startPos = postData.LastIndexOf("blobName=") + "blobName=".Length;
    int length = postData.IndexOf("submit=") - startPos;
    string blobName = postData.Substring(startPos, length);
    blobName = blobName.ToLower();      // Name of blob must be all lower-case

    log.Info("Blob name is: " + blobName);

    // START BLOB READING
    log.Info("Accessing Azure Storage account.");
    string containerAndBlob = "usertext-container/blob-" + blobName;

    var attributes = new Attribute[]
    {
         new StorageAccountAttribute("[StorageAccountName]"),
         new BlobAttribute(containerAndBlob)
    };

    try
    {
        userBlobText = await binder.BindAsync<string>(attributes);
    }
    catch (StorageException ex)
    {
        var requestInformation = ex.RequestInformation;
        var extendedInformation = requestInformation.ExtendedErrorInformation;

        if (extendedInformation == null)
        {
            log.Info("No Extended Error Information!");
            log.Info(requestInformation.HttpStatusMessage);
        }
        else
        {
            log.Info(requestInformation.HttpStatusMessage);

            var errorMessage = string.Format("({0}) {1}", extendedInformation.ErrorCode, extendedInformation.ErrorMessage);

            var errorDetails = extendedInformation.AdditionalDetails.Aggregate("", (s, pair) =>
            {
                return s + string.Format("{0}={1},", pair.Key, pair.Value);
            });

            log.Info(errorMessage + ": Error Details: " + errorDetails);
        }
    }

    log.Info("Text in Blob: " + userBlobText.ToString());
    // END BLOB READING

    return userBlobText == null
        ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass blob name in the request body.")
        : req.CreateResponse(HttpStatusCode.OK, "Your blob stored the text: " + userBlobText.ToString());
}

如何解决此问题,以便函数读取 blob 文本,并且 Web 浏览器显示 blob 的文本(现在我只得到一个空字符串)?提前感谢您。

共有1个答案

孔厉刚
2023-03-14

您应该利用绑定引擎,而不是手动连接到Blob存储。将<code>binder</code>参数添加到函数中,然后使用它检索文件

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, 
    TraceWriter log, Binder binder)
{
    // Do await, not .Result
    string postData = await req.Content.ReadAsStringAsync();

    // ... get your HTTP parameters here

    var attributes = new Attribute[]
    {
         new StorageAccountAttribute(accountName),
         new BlobAttribute(blobName) // blobName should have "container/blob" format
    };

    var userBlobText = await binder.BindAsync<string>(attributes);
    // do whatever you want with this blob...
}
 类似资料:
  • 我想利用AZURE Function应用程序从AZURE BLOB存储中读取XLSX文件。该函数应由REST API调用来调用。我可以访问blob并下载文件,但我很难用pandas直接读取文件内容。我找了几个小时,但是找不到解决办法。我的最新方法是这样的: 在MS homepage*上,有一个从blob下载文件并随后进行处理的例子,但由于我使用的是功能应用程序,如果我没有遗漏任何内容,那么首先下载

  • 我正在开发一个ASP.Net MVC 4应用程序,我使用Azure Blob来存储我的用户将要上传的图像。我有以下代码: 一旦执行if语句,我就会收到以下异常: 我以为这是集装箱的名字,但我看不出有什么问题。连接字符串似乎为blob创建了一个包含所有详细信息的良好存储。我不知所措。我研究过网络,每个人都说这是一个命名问题,但我没有发现任何错误。 我使用的测试容器名称:< code > imagea

  • 我使用blob触发器读取blob内容,作为pandas DF进行处理,并将blob附加到我使用的Azure SQL server。 blob触发器没有按预期工作,因此我将main函数中的所有代码都定义为: 但是,我得到了以下错误: 有人可以帮助我找到此问题的原因吗? function.json的配置如下:

  • 我在调试模式下运行它,并附加了一个包含异常详细信息的图像。我怎么知道出了什么问题?我试图在表中插入数据。azure不能告诉我更多细节吗? Obs:存储在Windows Azure上,而不是我的机器上。表已创建,但我在插入数据时出现此错误 下面是插入代码:

  • 用例 我有一个物联网中心设备,它向物联网中心发送遥测数据。我想处理遥测数据,例如使用函数存储到数据库。 功能 我在VS2019中创建了以下函数并将其发布到Azure: 资料来源:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-event-grid#use-作为事件网格触发器的http触发器 事件订阅

  • 我正在尝试从Azure函数访问存储帐户。但是在尝试检索文件时收到403错误。我看不出为什么会出现此错误有任何问题。 让我解释一下设置。 1-Azure function app位于美国东部2-Azure blob位于中南部3-Azure blob启用了防火墙(我已启用Azure服务可以访问)4-我还将function app的IP列入了白名单。(properties virtual IP)5-Az