在从.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?
2条答案
按热度按时间htzpubme1#
您可以删除
StringOutputFormatter
(如果需要,在RemoveType
调用后将其添加到options.OutputFormatters.Add(new StringOutputFormatter());
的末尾):42fyovps2#
字符串值是一个有效的JSON,但是它会让ASP.NET核心感到困惑,它不知道你想要它是一个application/json还是text/plain。在这种情况下,你可以做的是指定你需要一个application/json在请求levrating内容协商。
使用Accept为
application/json
将使asp.net核心返回application/json
而不是text/plain。x1c 0d1x和正确的标题。
或者,如果您想以全局方式执行,您可以删除纯文本格式器:
当然,这将防止您永远无法发送text/plain。即使您设置了Produces属性,或发送一个带有text/plain的Accept头。