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

.NET Core 6中Azure队列消息无法触发函数应用问题排查

问题分析与解决方案

核心问题出在序列化/反序列化不匹配以及类型定义不一致:

1. 类型定义冲突

发送端Message类的Id是string类型,接收端函数应用的Request类Id是Guid类型。.NET Core环境下用Newtonsoft.Json序列化字符串类型的Guid时,生成的JSON中Id是带引号的字符串;而Azure函数默认用System.Text.Json反序列化,它对Guid字段的字符串格式兼容性较弱,直接导致反序列化失败,触发死信机制。

2. 序列化库差异

发送端用Newtonsoft.Json(JsonConvert.SerializeObject),函数应用在.NET Core环境默认用System.Text.Json反序列化,两者的序列化行为存在细微差异,进一步加剧了反序列化失败的概率。

3. 异步方法不规范

函数中的Publish用async void写法,这在Azure函数中属于不规范用法,可能导致函数生命周期管理异常,虽不一定是死信直接原因,但会隐藏潜在问题。


具体修复步骤

步骤1:统一类型定义

将发送端和接收端的Id类型保持一致,二选一即可:

  • 发送端调整Message类:
public class Message
{
    public string AccessToken { get; set; }
    public Guid Id { get; set; }
    public string Trace { get; set; }
}
  • 接收端调整Request类:
public class Request
{
    public string AccessToken { get; set; }
    public string Id { get; set; }
    public string Trace { get; set; }
}

步骤2:统一序列化库(可选,类型统一后仍有问题时使用)

让函数应用也用Newtonsoft.Json反序列化:

  1. 安装Microsoft.Azure.Functions.Extensions和Newtonsoft.Json NuGet包
  2. 添加配置类指定序列化库:
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Newtonsoft.Json;

[assembly: FunctionsStartup(typeof(YourFunctionNamespace.Startup))]
namespace YourFunctionNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddMvcCore().AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.ContractResolver = new DefaultContractResolver();
            });
        }
    }
}

步骤3:修复异步方法

将函数的async void改为async Task:

public async Task Publish([QueueTrigger("my-queue")]Request request, ILogger logger)
{
    logger.LogInformation("Publish called {Request}", request.ToString());
}

验证方式

修复后重新部署.NET Core发送端和函数应用,发送消息后观察队列,确认消息不会被移入死信队列,函数可正常接收处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:44:59