You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,需调整项目配置和函数写法:

  1. 确保项目文件(.csproj)中启用孤立进程:
<PropertyGroup>
  <TargetFramework>net6.0</TargetFramework>
  <AzureFunctionsVersion>v4</AzureFunctionsVersion>
  <FunctionsWorkerRuntime>dotnet-isolated</FunctionsWorkerRuntime>
</PropertyGroup>
  1. 修改Program.cs,只保留孤立进程配置:
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(builder =>
    {
         builder.UseMiddleware<Auth>();
    })
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .Build();

host.Run();
  1. 调整函数为孤立进程兼容的写法:
[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:42:03