当前位置: 欣欣网 > 码农

ASP.NET Core 指定Action的响应类型

2024-02-17码农

1.格式化Ation输出

Action方法可以返回指定的格式例而忽略客户端请求格式,例如:使用JsonResult返回JSON格式的数据,ContentResult返回字符串数据

如果返回的不是IActionResult类型,系统会使用合适的格式化器 IOutputFormatter格式化输出的格式

默认情况下,内置的ControllerBase.Ok方法返回Json类型的格式:

[HttpGet]public IActionResult Get() => Ok(_todoItemStore.GetList());

上面代码非常简单返回一个todo列表,我们使用F12在浏览器中可以看到如下:

响应头包含Content-Type: application/json; charset=utf-8

使用 ContentResult和Content返回字符串数据

[HttpGet("Version")]public ContentResult GetVersion() => Content("v1.0.0");

我们看到返回的Content-Type是text/plain

2.内容协商

最常用的HTTP协商有2种方式:

服务器驱动型内容协商(Server-driven negotiation) :服务器根据客户端请求中的信息,如Accept头部字段(表示客户端可以接受的响应内容类型)、Accept-Language头部字段(表示客户端首选的语言)、Accept-Encoding头部字段(表示客户端支持的内容编码方式)等,决定响应内容。服务器会根据这些信息选择最适合的响应内容,并将其包含在响应中。

客户端驱动型内容协商(Agent-driven negotiation) :客户端发送的请求中包含了资源的一些特定要求,例如通过使用Accept头部字段中指定特定的内容类型或者使用Quality Values(q值)来表明优先级。服务器根据这些请求条件来选择响应内容,然后返回最符合条件的内容。

内容协商发生在当客户端指定一个 Accept header,在rfc9110(https://www.rfc-editor.org/rfc/rfc9110#field.accept)中,参与http内容协商有5个字段,他们分别为:

  • Accept

  • Accept-Charset

  • Accept-Encoding

  • Accept-Language

  • Vary

  • ASP.NET Core默认使用JSON格式,ASP.NET Core中支持下列媒体类型:

  • application/json

  • text/json

  • text/plain

  • 当Action方法返回POCO(普通C#类),运行时会自动创建一个ObjectResult对象类封装这个POCO,客户端会收到序列化之后的对象,如果没有找到该对象将返回204 No Content

    下列对象将返回一个POCO类型

    [HttpGet("{id:long}")]public TodoItem? GetPOCOById(long id) => _todoItemStore.GetById(id);

    当Accept出现在请求的Header中时则会发生内容协商,首先ASP.NET Core会按照顺序枚举头部Accept中的媒体类型,这个顺序会根据Accept中指定Q值的权重来枚举,尝试找到一个符合的格式化器来生成相应

    3.配置格式化器

    ASP.NET Core应用程序支持挂载额外的格式化器,输入格式化器和输出的格式化器通常是分开的,输入的格式化器通常使用模型绑定,输出格式化器通常用来格式化响应

    3.1 XML格式化器支持

    配置XML格式化器,使用XmlSerializer

    builder.Services.AddControllers() .AddXmlSerializerFormatters();

    3.2 配置基于System.Text.Json格式化器

    使用下面代码配置基于System.Text.Json的格式化器:

    builder.Services.AddControllers() .AddJsonOptions(options => { //JSON 序列化器将使用 .NET 对象的属性名作为 JSON 属性名,而不会进行任何额外的命名转换 options.JsonSerializerOptions.PropertyNamingPolicy = null; });

    3.3 配置基于Newtonsoft.Json格式化器

    默认使用了System.Text.Json的JSON格式化,我们可以通过配置来使用Newtonsoft.Json格式化器,需要安装如下包

    Microsoft.AspNetCore.Mvc.NewtonsoftJson

    配置如下:

    builder.Services.AddControllers() .AddNewtonsoftJson();

    Newtonsoft.Json比System.Text.Json提供了更多丰富的特性, System.Text.Json虽然没有 Newtonsoft.Json提供的功能丰富,但是在性能方面更好,这个可以根据自己的需求来选择

    4. 指定返回特定的格式

    我们可以使用[Produces] 过滤器来指定响应格式, [Produces]过滤器能够使用在Action,Controller或Global级别

    [ApiController][Route("api/[controller]")][Produces("application/json")]public class TodoItemsController : ControllerBase{..........}

    源代码地址:

    https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/Fundamentals/AspNetCore.APIControllers/AspNetCore.FormatResponseOutputData

    参考文章:

    https://learn.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-8.0