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

如何为Azure上的ASP.NET RESTful API定义应用生命周期变量测试健康检查

解决方案:用单例服务存储实例级状态

要实现单个实例独立的故障模拟状态,最直接的方式是利用ASP.NET的单例服务——它的生命周期和应用进程完全绑定,且每个实例的单例是独立隔离的,不会跨实例共享状态。

1. 定义状态存储类

创建一个简单的类来保存当前实例的故障标记,提供修改和读取接口:

public class InstanceHealthState
{
    // 标记当前实例是否模拟故障
    public bool IsSimulatingFailure { get; private set; } = false;

    // 修改故障状态的方法
    public void ToggleFailureState(bool enable)
    {
        IsSimulatingFailure = enable;
    }
}

2. 注册单例服务

在Program.cs中将状态类注册为单例,确保每个实例只维护一份状态:

builder.Services.AddSingleton<InstanceHealthState>();

3. 添加状态控制API

新建控制器(或在现有控制器中扩展),提供触发/取消故障的端点:

[ApiController]
[Route("api/instance")]
public class InstanceController : ControllerBase
{
    private readonly InstanceHealthState _healthState;

    public InstanceController(InstanceHealthState healthState)
    {
        _healthState = healthState;
    }

    // 通过URL参数控制故障状态
    [HttpPost("simulate-failure")]
    public IActionResult SetFailureState([FromQuery] bool enable)
    {
        _healthState.ToggleFailureState(enable);
        return Ok(new { Status = $"实例故障模拟已{(enable ? "开启" : "关闭")}" });
    }
}

4. 修改健康检查逻辑

在健康检查中读取状态,返回对应结果:

// 配置自定义健康检查
builder.Services.AddHealthChecks()
    .AddCheck("instance-status", () =>
    {
        var state = builder.Services.BuildServiceProvider().GetRequiredService<InstanceHealthState>();
        return state.IsSimulatingFailure
            ? HealthCheckResult.Unhealthy("实例已触发模拟故障")
            : HealthCheckResult.Healthy("实例运行正常");
    });

5. 精准触发单个实例

Azure Web App多实例默认是轮询负载,要单独修改某一个实例的状态:

  • 登录Azure门户,进入Web App的「实例」页面,复制目标实例的实例IP+端口
  • 用Postman或curl直接请求该实例的http://[实例IP:端口]/api/instance/simulate-failure?enable=true,即可单独触发该实例的故障状态,另一个实例不受影响

方案优势

  • 单例状态和应用进程生命周期绑定,只要实例不重启,状态就会持久保留
  • 完全隔离实例状态,不会出现跨实例干扰的问题
  • 无需依赖外部存储(如Redis、数据库),实现简单且轻量化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:17:16