Azure Functions 项目函数未使用 [FromBody] 填充参数

问题描述 投票:0回答:1

使用.Net 8,我创建了一个Azure Function项目。在我的函数中,我想在参数中填充 accountRequest 对象。我尝试通过添加

[FromBody]
属性来获取 accountRequest,但 .NET 没有映射它。我可以通过使用像
HttpRequest req
这样的
req.ReadFromJsonAsync<AccountRequest>
参数来获取主体,但为了简单起见,我宁愿使用
FromBody
。有没有办法做到这一点,或者我需要依赖
req.ReadFromJsonAsync<AccountRequest>()

Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = "PriceList/GetAllPriceList")]
    [FromBody] AccountRequest accountRequest)
{
    // accountRequest is null
} 

项目详情: 我的项目指的是

Microsoft.AspNetCore.App
Microsoft.NETCore.App
框架。它还引用了许多
Microsoft.Azure.Functions.Worker
包,包括
Microsoft.Azure.Functions.Worker.SDK, Microsoft.Azure.Functions.Worker.Http, Microsoft.Azure.Functions.Worker.Http.AspNetCore.
我的项目包括一个类“AccountRequest”,定义为:

public class AccountRequest
{
    public string? AccountId { get; set; }
}

我使用 Postman 将 json 发布到该方法:

{ "AccountId": "bed94a30-0fc5-ea11-a812-000d3a531257" }

Program类Main方法有以下内容:

var host = new HostBuilder().ConfigureFunctionsWebApplication()…

c# .net azure azure-functions .net-8.0
1个回答
0
投票

我已修改代码如下,以使用 .Net8 隔离函数中的 [FromBody] 属性获取

AccountId 的值。

函数.cs-

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using System.Net;

namespace _78391282
{
    public class Function1
    {
        private readonly ILogger<Function1> _logger;

        public Function1(ILogger<Function1> logger)
        {
            _logger = logger;
        }

        [Function("Function1")]
        public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "PriceList/GetAllPriceList")] HttpRequestData req, 
            [FromBody] AccountRequest accountRequest)
        {
            _logger.LogInformation("C# HTTP trigger function processed a request.");

            var response = req.CreateResponse(HttpStatusCode.OK);
            response.WriteString($"Account Id is: {accountRequest.AccountId}");
            return response;
        }
    }
    public class AccountRequest
    {
        public string? AccountId { get; set; }
    }
}

Program.cs
文件如下所示-

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .Build();

host.Run();

我在

.csproj
文件中有以下软件包。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <RootNamespace>_78391282</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.1" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.4" />
    <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.21.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.1.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
  </ItemGroup>
</Project>

我能够在调用函数 URL 时获得预期的响应。

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.