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

如何通过.NET代码接收Azure虚拟机状态变更通知?

Hey there! 👋 针对你用Azure Libraries for .NET开发管理员UI,想要实时获取VM状态变更通知来提升UI响应性的需求,我整理了几个适配你场景的靠谱方案,都是基于Azure原生机制的,直接就能和你的现有代码集成:

推荐方案1:Azure Event Grid 资源组级订阅(实时通知)

这是最贴合你需求的方案——它能在VM状态发生变更时(比如启动、停止、解除分配、配置更新)主动推送事件,完全不需要轮询,响应性拉满,还支持资源组级别的批量通知。

第一步:用Azure Libraries for .NET创建Event Grid订阅

你可以直接在代码里完成订阅配置,指定监听资源组下所有VM的状态变更事件:

using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.EventGrid;
using Azure.ResourceManager.EventGrid.Models;

// 初始化ArmClient(用默认Azure凭据,适配本地开发/部署场景)
var armClient = new ArmClient(new DefaultAzureCredential());
// 获取目标资源组
var resourceGroupId = new ResourceIdentifier("/subscriptions/{你的订阅ID}/resourceGroups/{目标资源组名}");
var resourceGroup = await armClient.GetResourceGroupResource(resourceGroupId).GetAsync();

// 配置Event Grid订阅参数
var subscriptionData = new EventGridSubscriptionData()
{
    // 指定事件接收端点(你的UI服务接口)
    Destination = new WebHookEventSubscriptionDestination()
    {
        EndpointUrl = new Uri("https://你的内部UI服务/api/vm-status-updates")
    },
    // 过滤需要监听的VM状态变更事件
    Filter = new EventSubscriptionFilter()
    {
        IncludedEventTypes = new List<string>()
        {
            "Microsoft.Compute/virtualMachines/write",       // VM配置/状态更新
            "Microsoft.Compute/virtualMachines/deallocate/action", // 解除分配
            "Microsoft.Compute/virtualMachines/start/action",      // 启动
            "Microsoft.Compute/virtualMachines/restart/action"     // 重启
        }
    }
};

// 创建资源组级别的Event Grid订阅
await resourceGroup.GetEventSubscriptions()
    .CreateOrUpdateAsync(WaitUntil.Completed, "VmStatusChangesSubscription", subscriptionData);

第二步:在UI服务中接收并处理事件

用ASP.NET Core写个Webhook接口接收Event Grid推送的事件,解析后同步到UI(比如用SignalR实时推送给前端):

[ApiController]
[Route("api/vm-status-updates")]
public class VmStatusUpdatesController : ControllerBase
{
    private readonly IVmStatusHub _vmStatusHub; // 假设你用SignalR做实时推送

    public VmStatusUpdatesController(IVmStatusHub vmStatusHub)
    {
        _vmStatusHub = vmStatusHub;
    }

    [HttpPost]
    public async Task<IActionResult> ReceiveEvents([FromBody] EventGridEvent[] events)
    {
        foreach (var gridEvent in events)
        {
            // 解析VM状态变更数据
            if (gridEvent.Data is JsonElement eventData)
            {
                var vmName = eventData.GetProperty("resourceName").GetString();
                var operation = eventData.GetProperty("operationName").GetString();
                var status = eventData.GetProperty("status").GetString();
                
                // 实时推送到UI前端,更新状态
                await _vmStatusHub.Clients.All.SendAsync("VmStatusUpdated", vmName, operation, status);
            }
        }
        return Ok();
    }
}
备选方案2:Azure Monitor 警报 + 动作组

如果需要更灵活的告警规则(比如只关注特定VM的状态变更,或者自定义触发条件),可以用Azure Monitor设置VM状态警报,通过动作组推送通知到你的UI服务:

  • 在Azure Monitor中创建警报规则,将目标设为资源组下的所有VM,信号类型选择「虚拟机状态」,设置条件为PowerState变更;
  • 添加动作组,选择「Webhook」类型,填写你的UI服务接口地址,当状态变更触发警报时,就会自动推送状态信息。
备选方案3:Azure Resource Graph 定期轮询(简单易实现)

如果对实时性要求不是特别高(比如允许几分钟的延迟),可以用Azure Resource Graph定期查询资源组下的VM状态,对比上次缓存的状态来更新UI:

using Azure.ResourceManager.ResourceGraph;

var graphClient = new ResourceGraphClient(new DefaultAzureCredential());
var queryRequest = new QueryRequest()
{
    // 查询资源组下所有VM的电源状态
    Query = @"Resources 
              | where type == 'Microsoft.Compute/virtualMachines' 
              | project name, powerState = properties.extended.instanceView.powerState.code",
    Subscriptions = new List<string>() { "{你的订阅ID}" },
    ResourceGroups = new List<string>() { "{目标资源组名}" }
};

var queryResponse = await graphClient.ResourcesAsync(queryRequest);
// 解析结果,对比之前缓存的状态,更新UI
关键注意事项
  • 权限配置:确保你的应用服务主体拥有EventGrid EventSubscription Contributor(创建订阅)和Reader(查询VM状态)的角色权限;
  • 幂等性处理:Event Grid会自动重试失败的通知,所以你的接收接口要支持重复事件去重(比如用事件ID做判断);
  • 网络连通性:如果你的UI服务是内部部署,需要确保Azure能访问到你的Webhook端点,或者配置Azure Private Link实现私有网络内通信。

内容的提问来源于stack exchange,提问作者Maxim V. Pavlov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:24:14