Azure Functions中间件未将请求转发至实际函数问题排查
问题原因及解决方案
核心问题:配置模式冲突
你同时混用了Azure Functions的两种不同运行模式配置,导致请求处理管道混乱,最终触发代理超时:
ConfigureFunctionsWebApplication是针对HTTP触发的ASP.NET Core集成模式,该模式下函数直接使用ASP.NET Core的请求管道,支持IActionResult返回类型。ConfigureFunctionsWorkerDefaults是针对孤立进程(Isolated Worker)模式,该模式下函数通过gRPC与宿主进程通信,使用IFunctionsWorkerMiddleware和HttpRequestData/HttpResponseData模型。
两者混用后,请求被错误地路由到孤立进程的代理管道,但你的函数是ASP.NET Core集成模式的写法,导致代理无法正确转发请求,最终超时。
解决方案
方案1:适配ASP.NET Core集成模式(推荐,适合HTTP优先的场景)
修改Program.cs,移除孤立进程相关配置,改用ASP.NET Core的中间件管道:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddApplicationInsightsTelemetryWorkerService(); builder.Services.ConfigureFunctionsApplicationInsights(); builder.Services.AddScoped<AuthMiddleware>(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseMiddleware<AuthMiddleware>(); // 添加自定义认证中间件 app.MapFunctions(); app.Run();
将原Auth中间件改为ASP.NET Core标准中间件:
internal class AuthMiddleware { private readonly RequestDelegate _next; public AuthMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { // 在这里实现你的认证逻辑,比如验证Header中的Token await _next(context); } }
你的原函数代码(IActionResult返回类型)无需修改,可直接使用。
方案2:切换到孤立进程模式
如果需要使用IFunctionsWorkerMiddleware,需调整项目配置和函数写法:
- 确保项目文件(
.csproj)中启用孤立进程:
<PropertyGroup> <TargetFramework>net6.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> <FunctionsWorkerRuntime>dotnet-isolated</FunctionsWorkerRuntime> </PropertyGroup>
- 修改
Program.cs,只保留孤立进程配置:
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(builder => { builder.UseMiddleware<Auth>(); }) .ConfigureServices(services => { services.AddApplicationInsightsTelemetryWorkerService(); services.ConfigureFunctionsApplicationInsights(); }) .Build(); host.Run();
- 调整函数为孤立进程兼容的写法:
[Function("MyFunc")] public HttpResponseData MyFunc([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "myfunc")] HttpRequestData req, FunctionContext executionContext) { var response = req.CreateResponse(HttpStatusCode.OK); return response; }
内容的提问来源于stack exchange,提问作者Leonardo Soto Jacobson
相关产品推荐
相关产品推荐

