Azure Functions V2将HttpRequest反序列化为对象

tok*_*709 3 c# azure-functions

我很惊讶我找不到答案,但我有一个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...
}
Run Code Online (Sandbox Code Playgroud)

但现在使用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...
}
Run Code Online (Sandbox Code Playgroud)

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

小智 10

您可以绑定到自定义对象而不是 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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

要绑定的模型..

public class Person
{
    public Person()
    {

    }
    public Person(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

HTTP 请求:[POST] http://localhost:7071/api/SayHello Body: { name: "Foo" }


mac*_*ura 9

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

string json = await req.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看此扩展方法的来源

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

var someModel = JsonConvert.DeserializeObject<SomeModel>(json);
Run Code Online (Sandbox Code Playgroud)