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
相关产品推荐
相关产品推荐

