【问题标题】:Azure Functions V2 Deserialize HttpRequest as objectAzure Functions V2 将 HttpRequest 反序列化为对象
【发布时间】:2021-09-02 21:31:03
【问题描述】:

我很惊讶我找不到答案,但我有一个 Azure 函数(HTTP 触发器),我只是想将内容反序列化为对象。以前使用 V1 我能够做到这一点,

函数 V1

[FunctionName("RequestFunction")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
    // Successful deserialization of the content
    var accountEvent = await req.Content.ReadAsAsync<AccountEventDTO>();

    // Rest of the function...
}

但现在 V2 看起来更像这样,

函数 V2

[FunctionName("RequestFunction")]
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
{
    // Content doesn't exist on HttpRequest anymore so this line doesn't compile
    var accountEvent = await req.Content.ReadAsAsync<AccountEventDTO>();

    // Rest of the function...
}

我可以让主体从 HttpRequest 对象访问流,但我不确定如何将其转换为预期的对象。有什么想法吗?

【问题讨论】:

    标签: c# azure-functions


    【解决方案1】:

    API 发生了一些变化。如您所见,Content 不再存在。但是,您仍然可以通过使用包含在 Microsoft.Azure.WebJobs.Extensions.Http 命名空间中的扩展方法来获得相同的功能(应该已经作为依赖项包含在内):

    string json = await req.ReadAsStringAsync();
    

    可以查看这个扩展方法的源码here

    然后你会使用 Json.NET 来反序列化(Json.NET 也已经是一个依赖项了)

    var someModel = JsonConvert.DeserializeObject<SomeModel>(json);
    

    【讨论】:

    • 谢谢,这正是我想要的。
    • @tokyo0709 如果我理解正确,我认为您必须反序列化函数本身中的字符串。可能有办法解决这个问题,但我总是在函数中反序列化,然后再将它传递给依赖库
    • @tokyo0709 因此,如果您正在执行队列触发功能,则默认参数 字符串,因此您只需获取该参数并反序列化即可。据我所知,队列触发器只处理字符串
    • 刚刚测试过。你又是对的。再次感谢非常感谢。如果可以的话,会给你 1000 个互联网积分。
    • 您完全正确,对此感到抱歉,您可以对您的答案进行 1 个字符更改,以便我可以更新它吗?我发现 azure 函数运行时再次更改并使旧代码过时
    【解决方案2】:

    您可以绑定到自定义对象而不是 HttpRequest。该对象是从请求的正文中创建的,并被解析为 JSON。类似地,可以将类型传递给 HTTP 响应输出绑定并作为响应正文返回,以及 200 状态代码。 示例:

    public static partial class SayHelloFunction
    {
        [FunctionName("SayHello")]
        public static async Task<ActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]Person person, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
    
            return person.Name != null ?
                    (ActionResult)new OkObjectResult($"Hello, {person.Name}")
                : new BadRequestObjectResult("Please pass an instance of Person.");
        }
    }
    

    要绑定的模型..

    public class Person
    {
        public Person()
        {
    
        }
        public Person(string name)
        {
            Name = name;
        }
    
        public string Name { get; set; }
    }
    

    HTTP 请求:[POST] http://localhost:7071/api/SayHello 正文:{ 名称:“Foo”}

    【讨论】:

      【解决方案3】:

      如果你不知道你的对象的类型,你可以这样做:

      string json = await req.ReadAsStringAsync();
      dynamic data = JObject.Parse(json);
      

      【讨论】:

        【解决方案4】:

        你甚至可以直接绑定到JObject

            [FunctionName("JsonEcho")]
            public static async Task<IActionResult> Run(
               [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]JObject json,
               ILogger log)
            {
                log.LogInformation($"Received some JSON: {json}");
        
                return new OkObjectResult(json)
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-16
          • 2020-05-10
          • 1970-01-01
          • 2015-01-09
          • 1970-01-01
          相关资源
          最近更新 更多