Azure 函数 http 触发器 Unity3d 2019.3
Azure functions http trigger Unity3d 2019.3
我创建了一个测试 HTTP 触发器 azure 函数。我可以在 Azure 门户和浏览器上正确触发它。然而,来自 Unity 编辑器的触发器给出 "Error 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 配置:请求凭据开启:启用访问控制允许凭据。
功能设置始终开启。 Integrate-Trigger:选择的方法 GET,POST。授权level:Function.
function's host.json: "version": "2.0", "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[1.*, 2.0.0)"
应用服务authentication:Anonymous
Unity-Azure sdk 和 google 设置搜索结果似乎都 outdated/not 受支持:(
请问我应该走什么路线才能使它正常工作?很高兴尝试任何 sdk / unity asset store 以达到您可能建议的天蓝色!干杯!
错误出现在您代码中的以下两行中:
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
了解不多,所以我不确定这个解决方案是否可行。
希望对您有所帮助。
我创建了一个测试 HTTP 触发器 azure 函数。我可以在 Azure 门户和浏览器上正确触发它。然而,来自 Unity 编辑器的触发器给出 "Error 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 配置:请求凭据开启:启用访问控制允许凭据。 功能设置始终开启。 Integrate-Trigger:选择的方法 GET,POST。授权level:Function.
function's host.json: "version": "2.0", "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[1.*, 2.0.0)"
应用服务authentication:Anonymous
Unity-Azure sdk 和 google 设置搜索结果似乎都 outdated/not 受支持:( 请问我应该走什么路线才能使它正常工作?很高兴尝试任何 sdk / unity asset store 以达到您可能建议的天蓝色!干杯!
错误出现在您代码中的以下两行中:
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
了解不多,所以我不确定这个解决方案是否可行。
希望对您有所帮助。