У меня есть веб-API ASP.NET Core, который может генерировать ответы XML и JSON. Для одного из моих контроллеров я разрешаю создавать как XML, так и JSON. Однако для всех остальных конечных точек я хочу создавать только JSON. В настоящее время я получаю код состояния HTTP 406, когда запрос отправляется с помощью Accept: application/xml. Однако код, принадлежащий действию, выполняется, потребляя ненужные ресурсы.
Настройка
Мне удалось настроить это довольно легко с помощью Шаблон веб-API ASP.NET Core в Visual Studio (.NET 8). В Program.cs у меня есть:
Код: Выделить всё
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers(options =>
{
// This line enables returning 406 errors for unsupported media types.
options.ReturnHttpNotAcceptable = true;
})
// This line enables XML support for the APIs.
.AddXmlSerializerFormatters();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Код: Выделить всё
namespace TestApi.Controllers
{
[ApiController]
[Route("[controller]")]
[Produces(MediaTypeNames.Application.Json)]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger _logger;
public WeatherForecastController(ILogger logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable 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)]
})
.ToArray();
}
}
}
Код: Выделить всё
GET {{TestApi_HostAddress}}/weatherforecast/
Accept: application/xml
Есть ли способ гарантировать, что ASP.NET на этапе согласования содержимого узнает, что можно получить код 406 вместо предварительного запуска кода в моем API?
Документация
https://learn.microsoft.com/en-us/aspne ... a-format-2
Подробнее здесь: https://stackoverflow.com/questions/792 ... ore-code-i