嗨,我正在项目 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();
结果没有中间件(我评论.ConfigureFunctionsWorkerDefaults(worker =>worker.UseMiddleware())):
忽略结果 500,在我的示例中这是正常的。
有人知道为什么我使用中间件时会发生这种情况吗?
从
.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;
}
}
}
我能够在执行函数时获取请求正文。
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)