首页 > 解决方案 > HttpRequestData 将正文包装在 { "json" : "" }

问题描述

我正在尝试设置一个 .NET 5 Azure Http 函数,该函数接受一个带有 json 正文的请求并将其输出到日志中。

using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Pipeline;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace MyProject.Test
{
    public sealed class Function
    {
        [FunctionName("Test")]
        public async Task RunAsync(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]
            HttpRequestData requestData,
            FunctionExecutionContext executionContext)
        {
            executionContext.Logger.LogInformation(requestData.Body);
        }
    }
}

我发布了一个 json 正文以使用 Postman

{
    "myProperty": "abc123"
}

哪个输出

{ "json": "{\"myProperty\":\"abc123\"}" }

我不确定为什么该函数将主体包裹在{ "json": "" }.

我是否错误地设置了该功能?或者它是否设置正确并且我可以通过另一种方式访问​​原始身体?

标签: jsonazureazure-functions.net-5

解决方案


原来我遵循了一个过时的指南来设置 .NET 5 Http Functions。微软官方指南有效。https://docs.microsoft.com/en-gb/azure/azure-functions/dotnet-isolated-process-guide

这需要将其中一些包添加到.csproj

    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.0.0" />
        <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.0.12" />
        <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.0.1" OutputItemType="Analyzer" />
        <PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="5.0.0" />
        <PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
        <PackageReference Include="System.Text.Json" Version="5.0.1" />
    </ItemGroup>

现在函数看起来像这样

using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;

namespace MyProject.Test
{
    public sealed class Function
    {
        [Function("Test")]
        public async Task<HttpResponseData> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]
            HttpRequestData requestData,
            FunctionContext context)
        {
            var myclass = await System.Text.Json.JsonSerializer.DeserializeAsync<MyClass>(requestData.Body);

            context.GetLogger("Test").LogInformation(myclass.MyProperty);

            var response = requestData.CreateResponse(System.Net.HttpStatusCode.OK);
            return response;
        }

        public class MyClass
        {
            [JsonPropertyName("myProperty")]
            public string MyProperty { get; set; }
        }
    }
}

json 正文现在可以正确序列化。


推荐阅读