Azure функции http триггера Unity3d 2019.3 - PullRequest
0 голосов
/ 03 марта 2020

Я создал тестовую функцию HTTP Trigger azure. Я могу правильно запустить его на портале azure и в браузере. Однако триггер из редактора Unity выдает «Ошибка HTTP / 1.1 500 Internal Server Error».

запуск Azure функция:

public static async Task<IActionResult> Run(HttpRequest req, ILogger log){
log.LogInformation("C# HTTP trigger function processed a request.");

string name = req.Query["name"];

string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;

return name != null
    ? (ActionResult)new OkObjectResult($"Hello, {name}")
    : new BadRequestObjectResult("Please pass a name on the query string or in the request body");}

Мой код Unity:

formData.Add(new MultipartFormDataSection("name", "SampleName", "text/plain"));
    UnityWebRequest www = UnityWebRequest.Post("https://samplefunction.azurewebsites.net/api/HttpTriggerTest?herelongblob", formData);
    yield return www.SendWebRequest();

Azure Конфигурация CORS: Запрос учетных данных ВКЛ .: Включить Access-Control-Allow -Credentials. Функция всегда включена. Интеграция-триггер: выбранные методы GET, POST. Уровень авторизации: Функция.

function's host.json: "version": "2.0", "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[1.*, 2.0.0)"

Аутентификация службы приложений: анонимная

Unity- Azure sdk и результаты поиска в настройках Google кажутся устаревшими / не поддерживаются :( Какой путь мне нужно выбрать, чтобы заставить это работать? Пожалуйста, с удовольствием попробуйте любой магазин ресурсов SDK / Unity, чтобы достичь azure, который вы можете предложить! Приветствия!

1 Ответ

1 голос
/ 03 марта 2020

Ошибка возникает в двух строках ниже в вашем коде:

string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);

Так как вы установили text/plain в своем коде. Поэтому, когда вы делаете www.SendWebRequest(), он отправляет данные формы, но не данные формата json. Таким образом, он покажет сообщение об ошибке.

Ниже я приведу код для вашей справки:

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    var arr = req.Form.Keys;
    foreach (var key in arr) {
        log.LogInformation(key);
        log.LogInformation(req.Form[key]);
    }

    return (ActionResult)new OkObjectResult("success");
}

Вы можете получить ключ и значение данных формы в приведенном выше коде, а затем составьте их в формате json и затем выполните DeserializeObject. Или, если вы хотите использовать данные для создания объекта, вы можете даже не делать DeserializeObject и просто устанавливать значение в свой объект напрямую.

Кстати, вы также можете попытаться изменить text/plain до application/json в вашем коде new MultipartFormDataSection("name", "SampleName", "text/plain"). Но, поскольку я мало что знаю о MultipartFormDataSection, поэтому я не уверен, что это решение может работать.

Надеюсь, оно поможет.

...