Sergio Solorzano
Sergio Solorzano

Reputation: 667

Azure functions http trigger Unity3d 2019.3

I've created a test HTTP Trigger azure function. I can trigger it correctly on azure portal and browser. However trigger from Unity editor gives "Error HTTP/1.1 500 Internal Server Error".

starting Azure function:

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");}

My Unity code:

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 configuration: Request Credentials ON: Enable Access-Control-Allow-Credentials. Function is setup always on. Integrate-Trigger: selected methods GET, POST. Authorisation level:Function.

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

App Service authentication:Anonymous

Unity-Azure sdk and google setup search results seems all outdated/not supported :( What route should I take to get this to work please? happy to try any sdk / unity asset store to reach azure you may suggest! Cheers!

Upvotes: 0

Views: 361

Answers (1)

Hury Shen
Hury Shen

Reputation: 15734

The error occurs in the two lines below in your code:

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

Since you set text/plain in your code. So when you do the www.SendWebRequest(), it will send a form data but not a json format data. So it will show the error message.

Below I provide the code for your reference:

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");
}

You can get the key and the value of the form data in the code above and then compose them to json format and then do DeserializeObject. Or if you want to use the data to create a object, you can even do not do DeserializeObject and just set the value into your object directly.

By the way, you can also try to change the text/plain to application/json in your code new MultipartFormDataSection("name", "SampleName", "text/plain"). But, as I don't know much about MultipartFormDataSection, so I'm not sure if this solution can work.

Hope it helps.

Upvotes: 1

Related Questions