Das Problem besteht darin, dass er in OpenAPI/Swagger nicht als Header-Parameterfeld angezeigt wird.
Ich brauche den Accept-Language-Headerparameter, um für Endpunkte angezeigt zu werden, die über den CurrentLanguage-Parameter verfügen
Was ich versucht habe
Ich glaube, dass CurrentLanguage IEndpointParameterMetadataProvider implementieren und entsprechende Metadaten hinzufügen sollte, aber ich konnte das nicht.
Einfaches Hinzufügen von builder.Metadata.Add(new FromHeaderAttribute { Name = "Accept-Language" }); bewirkt nichts.
Ich auch Ich habe versucht, LanguageParameterMetadata(ParameterInfo-Parameter) : IParameterBindingMetadata-Metadaten hinzuzufügen, aber auch das geht nicht, da diese Schnittstelle ParameterInfo-Parameter enthält, die einen geschützten Konstruktor haben und benutzerdefinierte Attribute nicht bearbeitet werden können.
Minimale Repro mit Problem:
Code: Select all
using Microsoft.AspNetCore.Mvc;
using System.Reflection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.MapGet("/test", (CurrentLanguage language, [FromHeader] string testHeader) => language.Value.Code);
app.Run();
record CurrentLanguage(Language Value) : IBindableFromHttpContext
{
public static ValueTask BindAsync(HttpContext context, ParameterInfo parameter)
{
var langValue = context.Request.Headers.AcceptLanguage.FirstOrDefault() ?? "en";
var language = new Language(langValue);
return ValueTask.FromResult(new CurrentLanguage(language))!;
}
}
record Language(string Code);
Code: Select all
app.MapGet("/test", (CurrentLanguage language, [FromHeader] string testHeader) => language.Value.Code)
.WithOpenApi(operation =>
{
operation.Parameters.Add(new OpenApiParameter
{
Name = "Accept-Language",
In = ParameterLocation.Header,
Required = false,
Description = "Language preference (e.g. en-US, ka-GE)",
Schema = new OpenApiSchema
{
Type = JsonSchemaType.String
}
});
return operation;
});
- Veraltet
- Muss manuell auf jeden Endpunkt angewendet werden
Code: Select all
record CurrentLanguage(Language Value) : IBindableFromHttpContext, IEndpointParameterMetadataProvider
{
public static ValueTask BindAsync(HttpContext context, ParameterInfo parameter)
{
var langValue = context.Request.Headers.AcceptLanguage.FirstOrDefault() ?? "en";
var language = new Language(langValue);
return ValueTask.FromResult(new CurrentLanguage(language))!;
}
public static void PopulateMetadata(ParameterInfo parameter, EndpointBuilder builder)
{
var p = (IParameterBindingMetadata)builder.Metadata[3];
var m = new LanguageParameterBindingMetadata("Accept-Language", p.HasTryParse, p.HasBindAsync, p.ParameterInfo, p.IsOptional);
builder.Metadata.Add(m);
}
}
class LanguageParameterBindingMetadata(string name, bool hastryParse, bool hasBindAsync, ParameterInfo parameterInfo, bool isOptonal)
: IParameterBindingMetadata
{
public string Name => name;
public bool HasTryParse => hastryParse;
public bool HasBindAsync => hasBindAsync;
public ParameterInfo ParameterInfo => parameterInfo;
public bool IsOptional => isOptonal;
}
Mobile version