如果我创建一个自定义类来充当整数数组的包装器,我就可以让它工作,但我不想做这个额外的步骤。我只想传递一个整数数组。
这是我最近的尝试:
using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")]
HttpRequestData req)
{
var ids = JsonSerializer.Deserialize<int[]>(req.Body);
...
}
我正在使用 Postman 进行本地测试。我将正文设置为 JSON,我的输入如下所示:
{
"ids": [1, 2, 3]
}
我收到一个 JSON 序列化错误,显然,b/c 它期望一个只有一个数组的对象,因为它是唯一的字段,名为“ids”。但这不是我想要解决这个问题的方式。
之前,我尝试过这个(基于 Mircosoft 自己的 documentation ):
using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using FromBodyAttribute = Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute;
public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")]
HttpRequestData req, [FromBody] int[] ids)
{
....
}
当我通过 Postman 使用上面的 JSON Body 输入方法时,我遇到了相同的序列化错误。
当我尝试将其作为原始文本(如 [1, 2, 3]
)传递时,我收到 System.InvalidOperationException 并显示以下消息:'System.Int32[]' is not由“DefaultFromBodyConversionFeature”支持
显然,基于最后一个异常,似乎 [FromBody]
不是正确的选择。但必须有某种我缺少的方法来做到这一点。这似乎是一个微不足道的问题,我很沮丧,因为我还没有找到解决方案。任何帮助将不胜感激。
最佳答案
如果你 body 的内容很简单:
[1,2,3]
您可以使用以下方法反序列化它:
public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
var ids = JsonSerializer.Deserialize<List<int>>(req.Body);
...
}
否则,如果您输入的是:
{
"ids": [1,2,3]
}
那么如果没有类定义,您就无法反序列化内容:
public class IdsDto
{
public List<int> ids { get; set; }
}
然后你可以像这样使用:
var idsDto = JsonSerializer.Deserialize<IdsDto>(req.Body);
var ids = idsDto.ids;
如果您真的想要避免中间类,您可以执行一些肮脏的字符串操作,只留下int[]
:
var intArrayString = req.Body.substring(req.Body.IndexOf('['), req.Body.IndexOf(']') - req.Body.IndexOf('[') + 1);
// And then:
var intArray = JsonSerializer.Deserialize<List<int>>(intArrayString);
但是,老实说,我会选择中级。
关于c# - 如何将 int 数组作为主体参数传递到 HTTP 触发的、点网隔离的 V4 Azure 函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77062702/