所以,我正在处理一些非常讨厌的遗留数据,我需要将其中的一些传递给 RESTful API。
我正在使用 WebApi Client(nuget 包),但遇到了一个问题:有时,我的一个模型对象包含一个包含无效 XML 字符(如 0xf1)的字符串。没有理由这些值应该在数据中,所以我真的只想过滤它们。
我的问题:当 XmlMediaTypeFormatter 尝试序列化我的对象图并遇到这些错误值之一时,它会抛出。(预期的)
我想做的是让它默默地回退到可以编码的字符。
我尝试替换 UTF8Encoding(见下面的代码),但我仍然得到异常。似乎在 DatacontractSerializer 深处的某个地方,他们正在使用自己的编码对象。
任何人都知道在发生编码错误时让 XmlMediaFormatter 使用回退字符的方法吗?
这是我到目前为止所尝试的:
var formatter = new System.Net.Http.Formatting.XmlMediaTypeFormatter();
formatter.SupportedEncodings.Clear();
// the second param in the ctor is throwOnInvalidBytes = false
var newUtf8Encoding = new System.Text.UTF8Encoding(false, false);
formatter.SupportedEncodings.Add(newUtf8Encoding);
var content = new System.Net.Http.ObjectContent(typeof(MyEntity), myInstance, formatter);
var stream = new MemoryStream();
content.CopyToAsync(stream).Wait(); // exception here, I hoped that fallback would occur
stream.Close();
- 我知道我们的长期解决方案必须是修复数据。
- 保持数据固定的唯一方法是修复编写错误值的遗留代码,这将花费大量时间和精力。我们会这样做,但我需要一个权宜之计。