[英]HttpClient HttpRequestMessage fails in net6 but works in net4.8
[英].NET 4.8 webapi migrate to .net6 issue with WrongEnum value
我正在將舊的 .NET 4.8 Web API 遷移到 .NET 6,並意識到 Json 轉換存在問題。 例如,這是 .NET 4.8 中的示例 Web API:
public enum SampleEnum
{
Bar,
Baz,
}
public class Jerry
{
public SampleEnum MyEnum { get; set; }
}
public class ValuesController : ApiController
{
// POST api/values
public void Post([FromBody] Jerry value)
{
var a = value;
}
}
如果請求的值明顯錯誤:
{
"MyEnum": "MonthEnd"
}
.net 4.8 中的 webapi 以上將使用枚舉 (Bar) 的默認值。
對於 .net 6 中使用 NewtonJson 或 Json.Text 的相同代碼,它會拋出異常說我無法理解 MonthEnd。
.net 6 是正確的行為,因為用戶傳遞了錯誤的值,但我的問題是我們的 webapi 已經投入生產很長時間了,我們不能冒客戶投訴突然激增的風險。
有沒有辦法模仿 .net 4.8 的行為(即,如果無法理解枚舉值,我們將回退到 deafult )?
您可以使用自定義轉換器解決方法。 例如像下面這樣的東西:
class CustomEnumConverter<T> : JsonConverter<T> where T: struct, Enum
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (Enum.TryParse<T>(reader.GetString(), out var r))
{
return r;
}
return default;
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) => writer.WriteStringValue(value.ToString("G"));
}
然后用它標記相應的屬性:
public class Jerry
{
[JsonConverter(typeof(CustomEnumConverter<SampleEnum>))]
public SampleEnum MyEnum { get; set; }
}
或者,如果您需要在全球范圍內執行此操作 - 創建一個轉換器工廠,它將重用該轉換器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.