ZetCode

ASP.NET Produces

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 Produces 属性。此属性对于控制 Web API 控制器中的响应内容类型至关重要。

ASP.NET 是一个跨平台、高性能的框架,用于构建现代 Web 应用程序。Produces 属性有助于定义操作可以返回的 MIME 类型。

基本定义

ASP.NET 中的 Produces 属性指定特定操作可以产生的响应内容类型。它有助于 Web API 中的内容协商。

当应用于操作或控制器时,Produces 将响应格式限制为指定的媒体类型。这确保客户端以预期的格式接收数据。

Produces 是 ASP.NET 内容协商系统的一部分。它与 HTTP 请求中的 Accept 标头一起工作,以确定最佳响应格式。

ASP.NET Produces 示例

以下示例演示了一个使用 Produces 属性来控制响应格式的 Web API 控制器。

Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();
app.Run();

这设置了一个基本的 ASP.NET 应用程序,并支持控制器。MapControllers 方法为控制器启用属性路由。

Controllers/WeatherController.cs
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class WeatherController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild",
        "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        });
    }

    [HttpGet("{id}")]
    [Produces("application/json", "application/xml")]
    public ActionResult<WeatherForecast> GetById(int id)
    {
        if (id < 1 || id > 5) return NotFound();
        
        return new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now.AddDays(id)),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        };
    }

    [HttpGet("text")]
    [Produces("text/plain")]
    public IActionResult GetTextForecast()
    {
        var forecast = new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        };
        
        return Content($"{forecast.Date}: {forecast.Summary}, {forecast.TemperatureC}°C");
    }
}

public record WeatherForecast
{
    public DateOnly Date { get; set; }
    public int TemperatureC { get; set; }
    public string? Summary { get; set; }
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

此控制器演示了 Produces 属性的三种不同用法。控制器级别的属性将 JSON 指定为默认响应格式。

第一个操作继承了控制器级别的 Produces 属性。第二个操作覆盖了它,以支持 JSON 和 XML 响应。第三个操作专门生成纯文本。

ApiController 属性为主模型启用自动 HTTP 400 响应。Route 为此控制器中的所有操作设置了基本路径。

该示例演示了如何在不同级别使用 Produces 来控制响应格式。它与 ASP.NET 的内容协商一起工作,以根据客户端偏好返回适当的格式。

来源

Microsoft ASP.NET Web API 格式文档

在本文中,我们探讨了 ASP.NET 8 中的 Produces 属性。此强大功能有助于确保您的 API 以预期的格式返回数据。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 ASP.NET 教程