Wir haben eine Versionsprüfer -API, die wir von .NET Core 3.1 auf .NET 8 Minimal API aktualisieren. Es muss rückwärts kompatibel sein, aber wir sind auf ein Problem gestoßen. Wir haben einen Konverter geschrieben, der von newtonsoft.json.jsonConverter erbt. /> Erwartete Ergebnis:
{"Version": {"Major": 9, "Minor": 16, "Build": 6, "Revision":-1, "MajorRevision":-1, "MinorRevision":-1} < /p>
Tatsächlicher Ergebnis:
{versions":16.16.2" /> VersionConverter < /p>
public class VersionConverter : JsonConverter
{
public override bool CanRead => true;
public override bool CanWrite => true;
public override Version ReadJson(JsonReader reader, Type objectType, Version existingValue, bool hasExistingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject)
{
int major = 0, minor = 0, build = -1, revision = -1;
while (reader.Read() && reader.TokenType != JsonToken.EndObject)
{
if (reader.TokenType == JsonToken.PropertyName)
{
string propertyName = reader.Value.ToString();
reader.Read();
switch (propertyName)
{
case "major":
major = Convert.ToInt32(reader.Value);
break;
case "minor":
minor = Convert.ToInt32(reader.Value);
break;
case "build":
build = Convert.ToInt32(reader.Value);
break;
case "revision":
revision = Convert.ToInt32(reader.Value);
break;
}
}
}
return new Version(major, minor, build, revision);
}
throw new JsonSerializationException("Unexpected token when deserializing Version");
}
public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("major");
writer.WriteValue(value.Major);
writer.WritePropertyName("minor");
writer.WriteValue(value.Minor);
writer.WritePropertyName("build");
writer.WriteValue(value.Build);
writer.WritePropertyName("revision");
writer.WriteValue(value.Revision);
writer.WritePropertyName("majorRevision");
writer.WriteValue(value.MajorRevision);
writer.WritePropertyName("minorRevision");
writer.WriteValue(value.MinorRevision);
writer.WriteEndObject();
}
}
< /code>
VersioncheckResponse < /p>
public class VersionCheckResponse
{
[JsonConverter(typeof(VersionConverter))]
public Version Version { get; set; }
}
< /code>
program.cs (vereinfacht) < /p>
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(new VersionConverter());
});
builder.Services.AddApiVersioning(options =>
{
options.ReportApiVersions = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ApiVersionReader = new HeaderApiVersionReader(HeaderNames.ApiVersion);
});
builder.Services.AddScoped();
builder.Services.AddControllers();
// Configure routing options for case-insensitive endpoints
builder.Services.Configure(options =>
{
options.LowercaseUrls = true;
options.LowercaseQueryStrings = true;
});
WebApplication app = builder.Build();
app.MapGet("/version", ([FromServices] IVersionManager versionManager, [FromQuery] string productName, [FromQuery] Version productVersion) =>
{
ValidationResult result = versionManager.CheckVersion(productName, productVersion);
if (result.IsValid)
{
return Results.Ok(new ApiResponse(result.Value));
}
return Results.BadRequest(new ApiResponse(result.ValidationMessage, result.ValidationErrors));
});
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.MapHealthChecks("/health");
app.Run();
< /code>
Zusätzliche Informationen: Nachdem die Frage als Duplikat geschlossen worden war, habe ich die andere Frage verwiesen und versucht, dasselbe mit System.Text.json zu machen. Ich habe auch Programm.cs geändert. Ich erhalte das gleiche Ergebnis. < /P>
VersionjsonConverter < /p>
public class VersionJsonConverter : System.Text.Json.Serialization.JsonConverter
{
public override Version Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// Handle the case where the input is the string version like "9.16.6"
if (reader.TokenType == JsonTokenType.String)
{
string versionString = reader.GetString();
return Version.Parse(versionString);
}
// Handle the case for the old format
if (reader.TokenType == JsonTokenType.StartObject)
{
JsonDocument doc = JsonDocument.ParseValue(ref reader);
JsonElement root = doc.RootElement;
int major = root.GetProperty("major").GetInt32();
int minor = root.GetProperty("minor").GetInt32();
int build = root.GetProperty("build").GetInt32();
int revision = root.TryGetProperty("revision", out JsonElement rev) ? rev.GetInt32() : -1;
int majorRevision = root.TryGetProperty("majorRevision", out JsonElement majRev) ? majRev.GetInt32() : -1;
int minorRevision = root.TryGetProperty("minorRevision", out JsonElement minRev) ? minRev.GetInt32() : -1;
return new Version(major, minor, build, revision);
}
throw new JsonException("Invalid format for Version");
}
public override void Write(Utf8JsonWriter writer, Version value, JsonSerializerOptions options)
{
// If you want to serialize in the old format with major, minor, build, revision etc.
writer.WriteStartObject();
writer.WriteNumber("major", value.Major);
writer.WriteNumber("minor", value.Minor);
writer.WriteNumber("build", value.Build);
writer.WriteNumber("revision", value.Revision); // Can be -1 if not specified
writer.WriteNumber("majorRevision", -1); // For compatibility, you can set these to -1
writer.WriteNumber("minorRevision", -1);
writer.WriteEndObject();
}
}
< /code>
program.cs Modifikationen < /p>
builder.Services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new VersionJsonConverter());
});
Wir haben eine Versionsprüfer -API, die wir von .NET Core 3.1 auf .NET 8 Minimal API aktualisieren. Es muss rückwärts kompatibel sein, aber wir sind auf ein [url=viewtopic.php?t=26065]Problem[/url] gestoßen. Wir haben einen Konverter geschrieben, der von newtonsoft.json.jsonConverter erbt. /> Erwartete Ergebnis: {"Version": {"Major": 9, "Minor": 16, "Build": 6, "Revision":-1, "MajorRevision":-1, "MinorRevision":-1} < /p> Tatsächlicher Ergebnis: {versions":16.16.2" /> VersionConverter < /p> [code] public class VersionConverter : JsonConverter { public override bool CanRead => true; public override bool CanWrite => true;
public override Version ReadJson(JsonReader reader, Type objectType, Version existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.StartObject) { int major = 0, minor = 0, build = -1, revision = -1;
while (reader.Read() && reader.TokenType != JsonToken.EndObject) { if (reader.TokenType == JsonToken.PropertyName) { string propertyName = reader.Value.ToString(); reader.Read();
switch (propertyName) { case "major": major = Convert.ToInt32(reader.Value); break; case "minor": minor = Convert.ToInt32(reader.Value); break; case "build": build = Convert.ToInt32(reader.Value); break; case "revision": revision = Convert.ToInt32(reader.Value); break; } } }
return new Version(major, minor, build, revision); }
throw new JsonSerializationException("Unexpected token when deserializing Version"); }
public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer) { writer.WriteStartObject(); writer.WritePropertyName("major"); writer.WriteValue(value.Major); writer.WritePropertyName("minor"); writer.WriteValue(value.Minor); writer.WritePropertyName("build"); writer.WriteValue(value.Build); writer.WritePropertyName("revision"); writer.WriteValue(value.Revision); writer.WritePropertyName("majorRevision"); writer.WriteValue(value.MajorRevision); writer.WritePropertyName("minorRevision"); writer.WriteValue(value.MinorRevision); writer.WriteEndObject(); } } < /code> VersioncheckResponse < /p> public class VersionCheckResponse { [JsonConverter(typeof(VersionConverter))] public Version Version { get; set; } } < /code> program.cs (vereinfacht) < /p> WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
// Add services to the container. builder.Services.AddControllers().AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new VersionConverter()); });
app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.MapHealthChecks("/health"); app.Run(); < /code> Zusätzliche Informationen: Nachdem die Frage als Duplikat geschlossen worden war, habe ich die andere Frage verwiesen und versucht, dasselbe mit System.Text.json zu machen. Ich habe auch Programm.cs geändert. Ich erhalte das gleiche Ergebnis. < /P> VersionjsonConverter < /p> public class VersionJsonConverter : System.Text.Json.Serialization.JsonConverter { public override Version Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // Handle the case where the input is the string version like "9.16.6" if (reader.TokenType == JsonTokenType.String) { string versionString = reader.GetString(); return Version.Parse(versionString); }
// Handle the case for the old format if (reader.TokenType == JsonTokenType.StartObject) { JsonDocument doc = JsonDocument.ParseValue(ref reader); JsonElement root = doc.RootElement;
int major = root.GetProperty("major").GetInt32(); int minor = root.GetProperty("minor").GetInt32(); int build = root.GetProperty("build").GetInt32(); int revision = root.TryGetProperty("revision", out JsonElement rev) ? rev.GetInt32() : -1; int majorRevision = root.TryGetProperty("majorRevision", out JsonElement majRev) ? majRev.GetInt32() : -1; int minorRevision = root.TryGetProperty("minorRevision", out JsonElement minRev) ? minRev.GetInt32() : -1;
return new Version(major, minor, build, revision); }
throw new JsonException("Invalid format for Version"); }
public override void Write(Utf8JsonWriter writer, Version value, JsonSerializerOptions options) { // If you want to serialize in the old format with major, minor, build, revision etc. writer.WriteStartObject(); writer.WriteNumber("major", value.Major); writer.WriteNumber("minor", value.Minor); writer.WriteNumber("build", value.Build); writer.WriteNumber("revision", value.Revision); // Can be -1 if not specified writer.WriteNumber("majorRevision", -1); // For compatibility, you can set these to -1 writer.WriteNumber("minorRevision", -1); writer.WriteEndObject(); } }
Ich habe Hintergrundarbeiter, der Hintergründerservice implementiert. Ich habe diesen Dienst zu Beginn meines Programms hinzugefügt.builder.Services.AddHostedService();
Ich arbeite derzeit an einem minimalen API-Projekt. Für Gestaltungszwecke muss die API über eine Funktion zum Senden von E-Mails unter Verwendung der Razor View-Vorlage im Textkörper verfügen. Ich...
Ich arbeite am Backend einer Webanwendung und möchte einen List mit einem @Converter als String beibehalten. Kompiliert Okay und beim Bereitstellen erhalte ich die folgende WARNUNG:
WARNING...
Ich bin auf ein interessantes Problem gestoßen und habe die letzten zwei Stunden praktisch mit dem Kopf gegen die Wand geschlagen, um es herauszufinden. Meine GUI funktionierte einwandfrei, bis ich...
Ich habe eine benutzerdefinierte AttributeConverter , die char (18) Spalte in einen Typ umwandelt. Gibt es eine Möglichkeit, eine Standardspaltendefinition zu haben, damit ich das wiederholen kann?