Как получить байтовые данные из тела запроса в приложении-функции Azure - PullRequest
0 голосов
/ 01 марта 2019

В Python я конвертировал изображение в байты.Затем я передаю байты URL-адресу конечной точки приложения-функции триггера Azure (портал Azure), как обычно, когда вызывает когнитивные службы Azure .

image_path = r"C:\Users\User\Desktop\bicycle.jpg"
image_data = open(image_path, "rb").read()
print(len(image_data)) # print length to compare later
url = "https://xxxx.azurewebsites.net/api/HTTPTrigger1........."
headers    = {'Content-Type': 'application/octet-stream'}
response = requests.post(url, headers=headers,
                             data=image_data)

Однако у меня естьне знаю, как получить байтовые данные в приложении функций на портале Azure.Я попробовал следующее (C #), но это не сработало.Кажется, ReadToEndAsync() не предназначен для чтения байтов данных из тела запроса?Или это из-за HttpRequest?

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    byte[] imageBytes = Encoding.ASCII.GetBytes(requestBody); 
    log.LogInformation(imageBytes.Length.ToString());
    // the length logged is totally not the same with len(image_data) in Python

    //ignore the following lines (not related)
    return name != null
    ? (ActionResult)new OkObjectResult("OK")
    : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

Есть идеи по этому поводу?Я знаю обходной путь с использованием строки base64, но мне просто интересно, как это делают когнитивные службы Azure!

Заранее спасибо.

1 Ответ

0 голосов
/ 01 марта 2019

Не используйте ReadToEndAsync(), вместо этого используйте MemoryStream().ReadToEndAsync() используется для чтения строкового буфера, который может испортить входящие байтовые данные.Используйте CopyToAsync(), а затем преобразуйте поток памяти в байтовый массив, чтобы сохранить входящие байтовые данные.

public static async Task<HttpResponseMessage> Run(HttpRequest req, ILogger log)
{
    //string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    MemoryStream ms = new MemoryStream(); 
    await req.Body.CopyToAsync(ms);
    byte[] imageBytes = ms.ToArray();
    log.LogInformation(imageBytes.Length.ToString());


    // ignore below (not related)
    string finalString = "Upload succeeded";
    Returner returnerObj = new Returner();
    returnerObj.returnString = finalString;
    var jsonToReturn = JsonConvert.SerializeObject(returnerObj);

    return new HttpResponseMessage(HttpStatusCode.OK) {
        Content = new StringContent(jsonToReturn, Encoding.UTF8, "application/json")
    };
}

public class Returner
{
    public string returnString { get; set; }
}

Ссылка / Вдохновленный: https://weblog.west -wind.com / posts / 2017 / sep/ 14 / прием-сырец-запроса тела контент-в-САШ-ядро-API-контроллеры

...