如何在ASP.NET Core 7中以JSON形式返回纯字符串

cmssoen2  于 2023-06-25  发布在  .NET
关注(0)|答案(2)|浏览(215)

在从.net framework迁移的过程中,正在为响应序列化的差异而挣扎。
这里的一切似乎都表明默认情况下响应将通过json序列化器发出。https://learn.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-5.0但是当返回一个简单的字符串值时,我们所有的端点都有“text/plain”的内容类型,所以文本没有被引号包围。
给定这个基本控制器:

[ApiController]
[Route("[controller]")]
public class SanityController : ControllerBase
{
    public SanityController()
    {
    }

    [HttpGet0]
    public string Get()
    {
        return "Where are the quotes?";
    }
}

我们的计划。cs:

var builder = WebApplication.CreateBuilder(args);

...

// Tried this as well, not sure what the difference even is between this an AddJsonOptions, seemed to work the same.
//builder.Services.Configure<JsonOptions>(options =>
//{
//    options.SerializerOptions.IncludeFields = true;
//    options.SerializerOptions.Converters.Add(new JsonStringEnumConverter());
//    options.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
//    options.SerializerOptions.PropertyNameCaseInsensitive = true;
//});

...

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.IncludeFields = true;
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
        options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
    });

...

app.Run();

但是,为所有返回字符串的端点返回的Content-Type只是“text/plain”。我们尝试将客户端上的Accept头从application/json, text/plain, */*更改为application/json, text/plain;q=0.9, */*;q=0.8,但它仍然返回文本。只有当我们只设置为application/json时,它才会最终返回json。但是当直接从浏览器窗口点击它时,这并没有帮助,它将再次返回“text/plain”。
我们还发现,也可以将[Produces("application/json")]放在控制器上,这也可以工作。
但是考虑到99%的端点都应该返回JSON,只有少数返回文本或xml,难道没有办法将字符串响应的激进默认值更改为application/json应用范围,就像www.example.com一样asp.net?

htzpubme

htzpubme1#

您可以删除StringOutputFormatter(如果需要,在RemoveType调用后将其添加到options.OutputFormatters.Add(new StringOutputFormatter());的末尾):

builder.Services.AddControllers(options =>
{
    options.OutputFormatters.RemoveType<StringOutputFormatter>();
});
42fyovps

42fyovps2#

字符串值是一个有效的JSON,但是它会让ASP.NET核心感到困惑,它不知道你想要它是一个application/json还是text/plain。在这种情况下,你可以做的是指定你需要一个application/json在请求levrating内容协商。
使用Accept为application/json将使asp.net核心返回application/json而不是text/plain。
x1c 0d1x和正确的标题。

或者,如果您想以全局方式执行,您可以删除纯文本格式器:

services.AddControllers(options => options.OutputFormatters.RemoveType<StringOutputFormatter>());

当然,这将防止您永远无法发送text/plain。即使您设置了Produces属性,或发送一个带有text/plain的Accept头。

相关问题