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

无法使用Azure Service Bus消息:Hashtable无法提取属性

解决Azure Function接收Service Bus JSON消息显示为System.Collections.Hashtable的问题

问题根源

出现这个问题通常有两个核心原因:

  1. 发送Service Bus消息时未指定Content-Type: application/json,导致Azure Function Runtime无法自动识别并正确反序列化JSON内容,直接将消息解析为Hashtable。
  2. 接收端代码未正确处理反序列化后的对象,直接输出整个Hashtable而非访问其属性。

解决方案一:先修正发送端的消息格式设置

在PowerShell发送消息时,必须显式设置消息的Content-Type为application/json,确保Function Runtime能正确识别JSON结构:

$jsonMessage = @{
        "filename" = $fileName
        "tenantId" = $tenantId
    } | ConvertTo-Json -Depth 1

# 使用Az.ServiceBus模块发送时指定ContentType
Send-AzServiceBusMessage -NamespaceName "你的ServiceBus命名空间" -QueueName "目标队列名" -Message $jsonMessage -ContentType "application/json"

解决方案二:PowerShell Function接收端处理

情况1:Runtime已自动反序列化为Hashtable

直接通过点符号访问属性即可,无需额外转换:

param($QueueItem, $TriggerMetadata)

# 直接提取属性
$targetFilename = $QueueItem.filename
$targetTenantId = $QueueItem.tenantId

Write-Host "处理文件: $targetFilename, 租户ID: $targetTenantId"

情况2:Hashtable访问不顺畅,转换为PSCustomObject

如果觉得Hashtable的属性访问不够直观,可以将其转换为PSCustomObject:

param($QueueItem, $TriggerMetadata)

# 将Hashtable转换为PSCustomObject
$messagePayload = [PSCustomObject]$QueueItem

$targetFilename = $messagePayload.filename
$targetTenantId = $messagePayload.tenantId

Write-Host "处理文件: $targetFilename, 租户ID: $targetTenantId"

情况3:消息以原始JSON字符串接收

如果发送端未设置Content-Type,消息可能以字符串形式传入,此时需要手动反序列化:

param($QueueItem, $TriggerMetadata)

# 手动将JSON字符串反序列化为对象
$messagePayload = $QueueItem | ConvertFrom-Json

$targetFilename = $messagePayload.filename
$targetTenantId = $messagePayload.tenantId

Write-Host "处理文件: $targetFilename, 租户ID: $targetTenantId"

解决方案三:C# Function接收端处理

如果你的Azure Function使用C#,可以通过定义匹配消息结构的类实现自动绑定:

// 定义与消息结构匹配的实体类
public class MessagePayload
{
    public string filename { get; set; }
    public string tenantId { get; set; }
}

public static void Run([ServiceBusTrigger("目标队列名", Connection = "ServiceBusConnection")] MessagePayload message, ILogger log)
{
    // 直接访问属性
    log.LogInformation($"处理文件: {message.filename}, 租户ID: {message.tenantId}");
}

如果需要手动处理JSON字符串:

using System.Text.Json;

public static void Run([ServiceBusTrigger("目标队列名", Connection = "ServiceBusConnection")] string message, ILogger log)
{
    // 手动反序列化JSON字符串
    var payload = JsonSerializer.Deserialize<MessagePayload>(message);
    log.LogInformation($"处理文件: {payload.filename}, 租户ID: {payload.tenantId}");
}

public class MessagePayload
{
    public string filename { get; set; }
    public string tenantId { get; set; }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:26:10