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

Azure部署API出现无提示500错误,求排查解决方法

问题描述

已将API部署至Azure,出现无提示的500 Internal Server Error。Swagger页面可正常显示,但发起连接请求时触发错误。本地开发环境下,启用带环境判断的Swagger代码段(如下注释部分)并连接Azure数据库时,API可正常运行。

附上完整Program.cs代码:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers()
    .AddJsonOptions(options =>
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "TangWeb_Api", Version = "v1" });
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        In = ParameterLocation.Header,
        Description = "Please Bearer and then token in the field",
        Name = "Authorization",
        Type = SecuritySchemeType.ApiKey
    });
    c.AddSecurityRequirement(new OpenApiSecurityRequirement {
                   {
                     new OpenApiSecurityScheme
                     {
                       Reference = new OpenApiReference
                       {
                         Type = ReferenceType.SecurityScheme,
                         Id = "Bearer"
                       }
                      },
                      new string[] { }
                    }
                });
});
builder.Services.AddDbContext<ApplicationBdContexte>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))
);
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders()
    .AddEntityFrameworkStores<ApplicationBdContexte>()
    .AddErrorDescriber<MultilanguageIdentityErrorMessage>();

var apiSettingSection = builder.Configuration.GetSection("APISettings");
builder.Services.Configure<APISettings>(apiSettingSection);

var apiSettings = apiSettingSection.Get<APISettings>();
var cle = Encoding.ASCII.GetBytes(apiSettings.SecretKey);

builder.Services.AddAuthentication(opt =>
{
    opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    opt.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new()
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(cle),
        ValidateAudience = true,
        ValidateIssuer = true,
        ValidAudience = apiSettings.ValidAudience,
        ValidIssuer = apiSettings.ValidIssuer,
        ClockSkew = TimeSpan.Zero
    };
});

builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
// Repositories
builder.Services.AddScoped<IDepartementRepository, DepartementRepository>();
builder.Services.AddScoped<IEpicerieRepository, EpicerieRepository>();
builder.Services.AddScoped<IEpicerieDetailsRepository, EpicerieDetailsRepository>();
builder.Services.AddScoped<IGabaritRepository, GabaritRepository>();
builder.Services.AddScoped<IGabaritDetailsRepository, GabaritsDetailsRepository>();
builder.Services.AddScoped<IItemRepository, ItemRepository>();
builder.Services.AddScoped<IUniteMesureRepository, UniteMesureRepository>();
builder.Services.AddScoped<IEpicerieDetailsRepository, EpicerieDetailsRepository>();
builder.Services.AddScoped<IInviteGabaritRepository, InviteGabaritRepository>();
builder.Services.AddScoped<IInviteEpicerieRepository, InviteEpicerieRepository>();
// Validateurs
builder.Services.AddScoped<IDepartementValidateur, DepartementValidateur>();
builder.Services.AddScoped<IGabaritValidateur, GabaritValidateur>();
builder.Services.AddScoped<IItemValidateur, ItemValidateur>();
builder.Services.AddScoped<IUniteMesureValidateur, UniteMesureValidateur>();
builder.Services.AddScoped<IEpicerieValidateur, EpicerieValidateur>();
builder.Services.AddScoped<IEpicerieDetailsValidateur, EpicerieDetailsValidateur>();
builder.Services.AddScoped<IGabaritDetailsValidateur, GabaritDetailsValidateur>();
builder.Services.AddScoped<IInviteGabaritValidateur, InviteGabaritValidateur>();
builder.Services.AddScoped<IInviteEpicerieValidateur, InviteEpicerieValidateur>();

builder.Services.AddRateLimitService(builder.Configuration.GetSection("RateLimitOption"));

builder.Services.AddCors(o => o.AddPolicy("Epicerie", builder =>
{
    builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader();
}));

var app = builder.Build();

// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
//    app.UseSwagger();
//    app.UseSwaggerUI();
//}
app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "Epicerie App v1");
    c.RoutePrefix = String.Empty;
});
app.UseHttpsRedirection();
app.UseCors("Epicerie");
app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

本地运行时启用的代码段:

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
排查与解决步骤

1. 核对Azure环境配置项

  • 检查Azure App Service的配置 > 应用程序设置中,ConnectionStrings:DefaultConnection、APISettings:SecretKey、APISettings:ValidAudience、APISettings:ValidIssuer等关键配置是否与本地完全一致,无拼写错误或遗漏。
  • 注意:若连接字符串通过Azure的"连接字符串"面板添加,会被builder.Configuration.GetConnectionString自动读取;若在"应用程序设置"中添加,则需用builder.Configuration["ConnectionStrings:DefaultConnection"]读取,确保读取逻辑匹配配置方式。

2. 启用详细错误日志定位问题

  • 打开Azure App Service的监控 > 日志流,查看请求触发500错误时的具体异常栈信息。
  • 可临时添加全局异常中间件(生产环境需移除),直接返回错误详情:
// 将此中间件放在app.UseRouting()之前
app.Use(async (context, next) =>
{
    try
    {
        await next();
    }
    catch (Exception ex)
    {
        context.Response.StatusCode = StatusCodes.Status500InternalServerError;
        context.Response.ContentType = "application/json";
        var response = new { Message = "服务器内部错误", Details = ex.ToString() };
        await context.Response.WriteAsJsonAsync(response);
    }
});

3. 验证JWT认证配置有效性

  • 确认APISettings:SecretKey长度至少为16字节(对应16个ASCII字符),过短会导致SymmetricSecurityKey初始化失败,触发认证异常。
  • 检查请求携带的JWT Token的Audience、Issuer与Azure配置的ValidAudience、ValidIssuer完全匹配(包括大小写)。

4. 排查数据库访问权限

  • 确认Azure SQL数据库防火墙已开启"允许Azure服务和资源访问此服务器"选项,放行App Service的访问请求。
  • 验证连接字符串中的数据库账号具备足够的读写权限,避免因权限不足导致数据库操作失败。

5. 检查RateLimit组件配置

  • 确认Azure环境中RateLimitOption配置项格式正确,可临时注释builder.Services.AddRateLimitService()代码,部署后测试是否仍出现500错误,排查是否为RateLimit组件初始化问题。

6. 确认中间件顺序正确性

  • 当前代码中UseAuthentication()、UseAuthorization()位于UseRouting()之后、MapControllers()之前,顺序符合规范;若后续添加其他中间件,需确保不会干扰请求处理流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:59:56