ASP.NET Core:如何用Results.Ok返回字符串时强制设置text/plain?
解决.NET Core 6最小API中Results.Ok返回text/plain的问题
直接修改context.Response.ContentType会被Results.Ok()内部逻辑覆盖,因为它会自动将内容类型设为application/json。以下是两种符合你需求的方案:
方案一:用Results.Text模拟Ok响应
Results.Text支持自定义内容类型和HTTP状态码,完全可以替代Results.Ok实现需求:
using System.Text.Json; app.MapGet("/example", () => { var data = new { Id = 1, Name = "Test" }; var jsonString = JsonSerializer.Serialize(data); return Results.Text(jsonString, "text/plain", statusCode: StatusCodes.Status200OK); });
这种方式既保留了使用Results的习惯,又能返回200 OK状态码和text/plain的内容类型,效果和直接返回data一致。
方案二:自定义Results扩展方法(提升复用性)
如果多个接口都需要这个逻辑,可以封装扩展方法简化调用:
using System.Text.Json; using Microsoft.AspNetCore.Http; public static class ResultExtensions { public static IResult OkAsPlainText<T>(this T data) { var jsonString = JsonSerializer.Serialize(data); return Results.Text(jsonString, "text/plain", statusCode: StatusCodes.Status200OK); } }
使用时直接调用扩展方法即可:
app.MapGet("/example", () => { var data = new { Id = 1, Name = "Test" }; return data.OkAsPlainText(); });
补充说明
Results.Ok()内部会创建JsonResult实例,该实例执行时会重新设置Response.ContentType为application/json,所以你提前设置的内容类型会被覆盖。而Results.Text是基于文本内容直接构建响应,不会覆盖指定的内容类型。
内容的提问来源于stack exchange,提问作者Daniel Williams
相关产品推荐
相关产品推荐

