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

.NET 3.1升级至6.0后Azure Functions运行失败求助排查

.NET 3.1升级到6.0后Azure Functions V4运行失败排查

问题背景

将.NET项目从3.1升级至6.0版本后,Azure Functions出现运行失败,错误日志仅显示:

Azure functions - Executed 'Function1' (Failed, Id=a8867dc8-3551-4396-84a4-ff55e86fd0f6, Duration=15ms)

已将AzureFunctionsVersion从V3改为V4,但问题仍未解决。

相关代码与配置

Function代码

[FunctionName("AuditManagerTopic")]
public async Task Run([ServiceBusTrigger(Constants.ServiceBusName.AuditTopic, Subscription, Connection = Constants.ConnectionString.ServiceBus)] Message message, ILogger logger)
{
    try
    {
        _ = logger;
        if (message == null)
            throw new ArgumentNullException(nameof(message));

        var activity = message.Body.DecompressGZip().FromBytes<ActivityAudit>();

        //TODO: Clean this logic up when full resolution of BUG 52019
        activity.Audit ??= activity.Payment;

        var auditManager = ManagerFactory.Create<IAuditManager>();

        await auditManager.Process(activity).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        logger.LogError(ex, "Unhandled exception.");
        throw;
    }
    
}

local.settings.json配置

{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet", "ConnectionStrings:ServiceBus": "Endpoint=sb://cde-sbn-cus-mstysync-01.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXX", "ConnectionStrings:shipmentDomainServiceBus": "Endpoint=sb://cde-sbn-cus-shipment-01.servicebus.windows.net/;SharedAccessKeyName=masteryDataSync;SharedAccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" } }

当前Azure依赖包版本

<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.Services.AppAuthentication" Version="1.6.2" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.EventHubs" Version="4.3.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.7.0" />

排查方向与解决方案

1. 调整依赖包版本适配.NET 6 + Functions V4

Functions V4对依赖包版本有明确要求,当前部分包存在兼容性问题:

  • Microsoft.Azure.Services.AppAuthentication:该包已被弃用,替换为Azure.Identity(版本1.9.0+),这是Functions V4推荐的身份验证库
  • 其余包版本升级:将剩余包升级到适配.NET 6的最新稳定版,修复已知兼容问题

更新后的PackageReference示例:

<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.2.0" />
<PackageReference Include="Azure.Identity" Version="1.10.4" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.EventHubs" Version="5.11.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.13.0" />

2. 修复ServiceBusTrigger参数类型兼容性

.NET 6 + Functions V4中,ServiceBusTrigger的推荐参数类型为ServiceBusReceivedMessage(来自Azure.Messaging.ServiceBus命名空间),旧的Message类型(Microsoft.Azure.ServiceBus命名空间)存在兼容性问题,需修改代码:

// 替换命名空间
using Azure.Messaging.ServiceBus;

// 修改函数参数与消息解析逻辑
public async Task Run([ServiceBusTrigger(Constants.ServiceBusName.AuditTopic, Subscription, Connection = Constants.ConnectionString.ServiceBus)] ServiceBusReceivedMessage message, ILogger logger)
{
    try
    {
        _ = logger;
        if (message == null)
            throw new ArgumentNullException(nameof(message));

        // 调整消息体解析方式
        var bodyBytes = message.Body.ToArray();
        var activity = bodyBytes.DecompressGZip().FromBytes<ActivityAudit>();

        activity.Audit ??= activity.Payment;

        var auditManager = ManagerFactory.Create<IAuditManager>();

        await auditManager.Process(activity).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        logger.LogError(ex, "Unhandled exception.");
        throw;
    }
}

3. 修正配置文件连接字符串位置

Azure Functions中,ConnectionStrings节点默认用于数据库连接,ServiceBus连接建议放在Values节点下,避免读取异常:
修改local.settings.json:

{ 
  "IsEncrypted": false, 
  "Values": { 
    "AzureWebJobsStorage": "UseDevelopmentStorage=true", 
    "FUNCTIONS_WORKER_RUNTIME": "dotnet", // 若用隔离模式则改为"dotnet-isolated"
    "ServiceBusConnection": "Endpoint=sb://cde-sbn-cus-mstysync-01.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "shipmentDomainServiceBus": "Endpoint=sb://cde-sbn-cus-shipment-01.servicebus.windows.net/;SharedAccessKeyName=masteryDataSync;SharedAccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
  } 
}

同时修改代码中ServiceBusTrigger的Connection参数为"ServiceBusConnection",与配置中的键对应。

4. 获取详细错误日志定位根因

当前日志仅显示失败状态,需开启详细日志:

  • 本地运行时,在local.settings.json添加:
    "Values": {
      // 其他配置
      "AzureFunctionsJobHost__logging__logLevel__Default": "Debug",
      "AzureFunctionsJobHost__logging__console__isEnabled": "true"
    }
    
  • 部署到Azure后,在Function App的监控-应用日志中查看完整异常堆栈,定位具体失败原因(如消息解析失败、依赖注入错误、权限问题等)。

5. 检查依赖注入逻辑

ManagerFactory.Create<IAuditManager>()可能存在实例创建失败问题,需确保依赖注入配置适配.NET 6:

  • 若使用in-process模式,在Startup.cs注册服务:
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddScoped<IAuditManager, AuditManager>();
        }
    }
    
  • 若使用隔离模式,在Program.cs注册服务:
    var host = new HostBuilder()
        .ConfigureFunctionsWorkerDefaults()
        .ConfigureServices(services =>
        {
            services.AddScoped<IAuditManager, AuditManager>();
        })
        .Build();
    
    host.Run();
    

内容的提问来源于stack exchange,提问作者Sudhakar Chitlam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:55:16