ProducesAttribute filtert keine Anforderungen in der ASP.NET Core-Web-API, bevor Code ausgeführt wirdC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 ProducesAttribute filtert keine Anforderungen in der ASP.NET Core-Web-API, bevor Code ausgeführt wird

Post by Anonymous »

Problem
Ich habe eine ASP.NET Core-Web-API, die XML- und JSON-Antworten erzeugen kann. Für einen meiner Controller erlaube ich die Erstellung von sowohl XML als auch JSON. Für alle anderen Endpunkte möchte ich jedoch nur JSON erzeugen. Ich erhalte derzeit den HTTP-Statuscode 406, wenn eine Anfrage mit Accept: application/xml gesendet wird. Allerdings wird der zur Aktion gehörende Code ausgeführt, was unnötige Ressourcen verbraucht.
Einrichtung
Dies ist mir ganz einfach mit dem gelungen ASP.NET Core-Web-API-Vorlage in Visual Studio (.NET 8). In der Program.cs habe ich:
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();


Dann habe ich im WeatherForecastController, der automatisch generiert wird, ein Produces-Tag wie dieses hinzugefügt:
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();
}
}
}

Wenn ich jetzt eine Anfrage wie diese stelle:
GET {{TestApi_HostAddress}}/weatherforecast/
Accept: application/xml

Ich erhalte zwar eine Fehlermeldung, aber das Einfügen eines Haltepunkts in die Get()-Methode zeigt, dass der Code ausgeführt wird, bevor ASP.NET Core erkennt, dass kein Formatierungsprogramm verfügbar ist.< /p>
Gibt es eine Möglichkeit sicherzustellen, dass ASP.NET während der Inhaltsverhandlungsphase weiß, dass eine 406 gegeben werden kann, anstatt den Code zuerst in meiner API auszuführen?
Dokumentation
https://learn.microsoft.com/en-us/aspne ... a-format-2

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post