req.Content.ReadAsStringAsync(). Результат всегда возвращает значение NULL при доступе из браузера (но не в портале Azure)

Ниже приведен мой полный код (приложение-функция Azure на портале Azure). Обратите особое внимание на эти две строки.

var jsonContent = req.Content.ReadAsStringAsync().Result; log.LogInformation("jsonContent" + jsonContent);

Когда я тестирую функцию, используя тело запроса под панелью справа, jsonContent распечатывается в журналах как следует. Тем не менее, используя функцию URL в браузере, и добавьте его с &name=azure, jsonContent является нулевым, как показано в журналах.

//full code
#r "Newtonsoft.Json"
using System.Net;
using Newtonsoft.Json;
using System.Text;

using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)
{
    // these two lines are problematic???
    var jsonContent = req.Content.ReadAsStringAsync().Result;
    log.LogInformation("jsonContent" + jsonContent);

    // you can ignore the following lines (not related to question)
    string jsonToReturn = "Hello World";

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

Я попытался изменить строку на это, но это тоже не сработало.

var jsonContent = await req.Content.ReadAsStringAsync().Result;

Ошибка что-то вроде

'string' does not contain a definition for 'GetAwaiter' and no extension method 'GetAwaiter' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)

Во всяком случае, я знаю обходной путь, который должен использовать HttpRequest вместо HttpRequestMessage чтобы генерировать jsonContent, но мне просто любопытно, почему дело не работает.

Кто-нибудь может определить мою ошибку? Спасибо!

2 ответа

Решение

Когда вы добавляете функцию URL в браузере с &name=azure, он устанавливает имя =azure в качестве заголовка http-запроса. Итак, если вы хотите отправить http-запрос с телом запроса, вы можете использовать почтальон для запуска функции Azure.

Вот мой тест:

Добавление в качестве запроса отличается от использования тела запроса. Вы можете вызвать функцию вместе с телом запроса в Python следующим образом (просто пример):

reqBody = {
        'customerid' : customerid,
        'imgdata' : imgdata
    }
headers = {
        'Content-Type': 'application/json',
    }
url = "https://xxxxx.azurewebsites.net/api/HTTPTrigger.............."
response = requests.post(url, headers=headers,
                             data=json.dumps(reqBody))
print(response.json())
Другие вопросы по тегам