当编码失败时,使XmlMediaTypeFormatter使用回退字符

时间:2013-07-18 21:58:28

标签: c# serialization character-encoding asp.net-web-api

所以,我正在处理一些非常讨厌的遗留数据,我需要将其中一些传递给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();

  • 我知道我们的长期解决方案必须是修复数据。
  • 保持数据不变的唯一方法是修复写入错误值的遗留代码,这将花费大量的时间和精力。我们会这样做,但我需要一个止拍。

0 个答案:

没有答案