.NET Core API 3.1 Swagger错误响应无描述问题求助(HTTPS重定向异常)
问题解决方案:.NET Core 3.1 + Swashbuckle 6.4.0 启用HTTPS重定向时错误响应丢失状态描述
核心原因推测
启用UseHttpsRedirection()后,重定向中间件可能在原始错误响应生成前截断了请求流程,导致状态码对应的描述信息无法正常返回。以下是针对性的解决方法:
1. 调整中间件注册顺序
确保错误处理逻辑优先于HTTPS重定向执行,让错误响应在重定向触发前完成生成:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI v1")); } // 先注册错误处理中间件 app.UseExceptionHandler("/error"); // 再注册HTTPS重定向 app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
2. 实现自定义错误响应处理器
通过自定义错误控制器,强制返回包含状态描述的标准化响应,不受重定向逻辑干扰:
步骤1:创建错误处理控制器
[ApiController] [Route("/error")] public class ErrorController : ControllerBase { [HttpGet] [HttpPost] [HttpPut] [HttpDelete] [HttpPatch] public IActionResult Error() { var statusCode = HttpContext.Response.StatusCode; // 映射状态码对应的描述文本 var statusDesc = statusCode switch { 400 => "Bad Request: 请求参数格式或内容无效", 401 => "Unauthorized: 未提供有效认证信息", 403 => "Forbidden: 无权限访问该资源", 404 => "Not Found: 请求的资源不存在", 500 => "Internal Server Error: 服务器处理请求时发生异常", _ => $"Error {statusCode}" }; return Problem( title: statusDesc, statusCode: statusCode, detail: HttpContext.Features.Get<IExceptionHandlerFeature>()?.Error?.Message ); } }
步骤2:确保错误处理中间件优先级
在Configure方法中保持UseExceptionHandler("/error")在UseHttpsRedirection()之前注册。
3. 配置Swagger UI展示错误响应描述
让Swagger UI能直观显示错误状态对应的说明:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyAPI", Version = "v1" }); // 为所有接口添加常见错误响应的描述 c.OperationFilter<CustomErrorResponseFilter>(); }); // 自定义响应过滤器 public class CustomErrorResponseFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { operation.Responses.TryAdd("400", new OpenApiResponse { Description = "Bad Request" }); operation.Responses.TryAdd("401", new OpenApiResponse { Description = "Unauthorized" }); operation.Responses.TryAdd("403", new OpenApiResponse { Description = "Forbidden" }); operation.Responses.TryAdd("500", new OpenApiResponse { Description = "Internal Server Error" }); } }
4. 优化HTTPS重定向配置
调整重定向规则,避免截断原始请求的响应内容:
services.AddHttpsRedirection(options => { // 使用307临时重定向,保留原始请求方法和数据 options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect; options.HttpsPort = 443; });
内容的提问来源于stack exchange,提问作者NotYetGrounded
相关产品推荐
相关产品推荐

