在我的 IFunctionsWorkerMiddleware 中无法获取值请求正文,并且 next(context) 不执行任何操作

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

嗨,我正在项目 azure 函数(隔离)中实现一个中间件,我需要从请求正文中获取值并将其显示在控制台中(来自中间件类),但我曾经得到空值“”,另一个问题是功能在下一个(上下文)方法中显然它没有被调用并且永远不会结束。

中间件

 public class HistoryLogMiddleware : IFunctionsWorkerMiddleware
 {
   public HistoryLogMiddleware() { }

   public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
   {
     var requestData = await context.GetHttpRequestDataAsync();
     var body = await new StreamReader(requestData.Body).ReadToEndAsync();

     Console.WriteLine($"Request Body: {body}");

     requestData.Body.Position = 0;
     await next(context); //when arrivals here does nothing...     
  }
}

功能

 public class RegisterClientFunction
 {
   private readonly IClientsDomain _clientsDomain;
   public RegisterClientFunction(IClientsDomain clientsDomain)
   {
     _clientsDomain = clientsDomain;
   }

   [Function(nameof(RegisterClientFunction))]
   public async Task<HttpResponseData> RunAsync(
     [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
   {
     //log.LogInformation("C# HTTP trigger function processed a request.");

     string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
     var data = JsonConvert.DeserializeObject<RegisterClientRequest>(requestBody);

     var respDomain = await ExecuterDomain.ExecuteAsync(() => _clientsDomain.RegisterClient(data));

     var response = req.CreateResponse((HttpStatusCode)respDomain.Status);
     response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
     await response.WriteStringAsync(JsonConvert.SerializeObject(respDomain).ToString(), Encoding.UTF8);

     return response;
   }
 }

Program.cs

var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureFunctionsWorkerDefaults(worker => worker.UseMiddleware<HistoryLogMiddleware>())
.ConfigureServices(services => {
    services.AddApplicationInsightsTelemetryWorkerService();
    services.ConfigureFunctionsApplicationInsights();
    services.AddDatabases();
    services.AddExternals();
    services.AddUseCases();
})
.Build();

await host.RunAsync();

结果使用中间件console no shows body and never ends

结果没有中间件(我评论.ConfigureFunctionsWorkerDefaults(worker =>worker.UseMiddleware())): console shows results ok

忽略结果 500,在我的示例中这是正常的。

有人知道为什么我使用中间件时会发生这种情况吗?

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

.ConfigureFunctionsWebApplication()
文件中删除
program.cs
。你应该有以下代码-

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

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

await host.RunAsync();

您的 .csproj 文件中应包含以下包。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <RootNamespace>_78438359</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.22.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.17.3-preview1" />
    <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.2.0" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
  </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>

出于测试目的,我在 RegisterClientFunction.cs 文件中给出了代码,并且在 HistoryLogMiddleware.cs 文件中没有进行任何更改。

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

namespace _78438359
{
    public class RegisterClientFunction
    {
        public RegisterClientFunction() { }

        [Function(nameof(RegisterClientFunction))]
        public async Task<HttpResponseData> RunAsync(
          [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
        {
            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            var data = JsonConvert.DeserializeObject<RegisterClientRequest>(requestBody);

            var response = req.CreateResponse(HttpStatusCode.OK);
            response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
            await response.WriteStringAsync("Client registered successfully.", Encoding.UTF8);

            return response;
        }
    }
}

我能够在执行函数时获取请求正文。

enter image description here

Azure Functions Core Tools
Core Tools Version:       4.0.5700 Commit hash: N/A +71cc84964a60bfb07d95839b7c666bd239507bdd (64-bit)
Function Runtime Version: 4.33.2.22572

[2024-05-07T06:17:12.240Z] Found C:\Users\******\78438359\78438359\78438359.csproj. Using for user secrets file configuration.
[2024-05-07T06:17:15.329Z] Azure Functions .NET Worker (PID: 12756) initialized in debug mode. Waiting for debugger to attach...
[2024-05-07T06:17:15.374Z] Worker process started and initialized.

Functions:

        RegisterClientFunction: [POST] http://localhost:7295/api/RegisterClientFunction

For detailed output, run func with --verbose flag.
[2024-05-07T06:17:20.445Z] Host lock lease acquired by instance ID '000000000000000000000000BF6D1ED5'.
[2024-05-07T06:17:59.976Z] Executing 'Functions.RegisterClientFunction' (Reason='This function was programmatically called via the host APIs.', Id=af21e1ad-f53b-4361-90fa-a285fb2e2b88)
[2024-05-07T06:18:00.136Z] Request Body: {
[2024-05-07T06:18:00.138Z]     "Name": "Hello Afreen"
[2024-05-07T06:18:00.139Z] }
[2024-05-07T06:18:00.357Z] Executed 'Functions.RegisterClientFunction' (Succeeded, Id=af21e1ad-f53b-4361-90fa-a285fb2e2b88, Duration=408ms)
© www.soinside.com 2019 - 2024. All rights reserved.