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

如何通过Azure定时函数(C#)程序化缩放SignalR服务?

Azure定时函数(C#)程序化缩放SignalR服务方案

实现思路

借助Azure Resource Manager(ARM)管理API修改SignalR服务的SKU配置,结合定时函数的触发能力,通过已配置的托管标识完成身份认证(无需手动管理密钥)——由于托管标识已拥有SignalR服务的Contributor角色,具备修改资源配置的权限。

推荐NuGet库

优先使用Azure.ResourceManager.SignalR,这是Azure官方推出的新一代管理库,基于Azure.Core框架,原生支持托管标识认证,API设计简洁且维护活跃。旧版的Microsoft.Azure.Management.SignalR可作为替代,但不推荐长期使用。

代码示例(含托管标识)

以下是基于TimerTrigger的定时函数示例,实现从Free SKU升级至Standard SKU:

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.SignalR;
using Azure.ResourceManager.SignalR.Models;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

public class ScaleSignalRFunction
{
    private readonly ILogger<ScaleSignalRFunction> _logger;
    private readonly ArmClient _armClient;

    public ScaleSignalRFunction(ILogger<ScaleSignalRFunction> logger)
    {
        _logger = logger;
        // 通过DefaultAzureCredential自动获取托管标识凭证
        _armClient = new ArmClient(new DefaultAzureCredential());
    }

    [Function("ScaleSignalR")]
    public async Task Run([TimerTrigger("0 0 2 * * *")] TimerInfo myTimer) // 每天凌晨2点触发
    {
        _logger.LogInformation($"ScaleSignalR function executed at: {DateTime.Now}");

        // 替换为你的资源组名称和SignalR服务名称
        string resourceGroupName = "your-resource-group";
        string signalRName = "your-signalr-service";

        // 获取默认订阅(如需指定订阅ID,可传入对应参数)
        var subscription = await _armClient.GetDefaultSubscriptionAsync();
        // 获取目标资源组
        var resourceGroup = await subscription.GetResourceGroupAsync(resourceGroupName);
        // 获取SignalR服务资源
        var signalRResource = await resourceGroup.GetSignalRAsync(signalRName);

        // 构建SKU更新参数
        var updateParameters = new SignalRResourceUpdate()
        {
            Sku = new SignalRSkuInfo()
            {
                Name = SignalRSkuName.StandardS1, // 目标SKU:Standard_S1
                Tier = SignalRSkuTier.Standard,
                Capacity = 1 // 实例数量,可按需调整
            }
        };

        // 执行SKU更新操作
        await signalRResource.UpdateAsync(WaitUntil.Completed, updateParameters);
        _logger.LogInformation($"SignalR service {signalRName} scaled to Standard_S1 successfully.");
    }
}

关键注意事项

  • 权限验证:确认托管标识已被授予SignalR服务所在资源组或单个服务的Contributor角色,避免因权限不足导致请求失败。
  • SKU有效值:需使用SignalRSkuName枚举中的合法值,如FreeF1、StandardS1、PremiumP1等,禁止传入无效SKU名称。
  • 异常处理:建议添加异常捕获逻辑,处理网络波动、资源不存在、权限不足等场景,保障函数执行稳定性。
  • 触发时机:根据业务需求调整TimerTrigger的Cron表达式,确保在合适时段执行缩放操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 01:07:11