【发布时间】:2019-07-15 18:41:51
【问题描述】:
给定两个 XML 文件,其内容开头如下:
文件 A
<?xml
文件 B
<?xml
文件 B 会出错。所以我们实现了以下代码来移除在生产环境中工作多年的 BOM:
private static string RemoveUTF8ByteOrderMark(string str)
{
var byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (str.StartsWith(byteOrderMarkUtf8))
{
str = str.Remove(0, byteOrderMarkUtf8.Length);
}
return str;
}
删除 BOM 后,我们使用以下方法将字符串解析为 XML:
public static XDocument ParseXmlDocumentFromText(string fileText)
{
if (string.IsNullOrEmpty(fileText)) return null;
var nsm = new XmlNamespaceManager(new NameTable());
nsm.AddNamespace("*****", "*****");
var ctx = new XmlParserContext(null, nsm, null, XmlSpace.Default);
var settings = new XmlReaderSettings { ProhibitDtd = false, XmlResolver = null };
using (var fs = new StringReader(fileText))
{
using (var reader = XmlReader.Create(fs, settings, ctx))
{
var doc = new XmlDocument();
doc.Load(reader);
return XDocument.Parse(doc.OuterXml);
}
}
}
现在,我们已将我们的网站从专用服务器迁移到 Azure Web 应用程序,在文件 B 继续正确加载的同时,文件 A 出现错误 doc.Load(reader);。
System.Web.HttpUnhandledException (0x80004005): 类型异常 'System.Web.HttpUnhandledException' 被抛出。 ---> System.Xml.XmlException:根级别的数据无效。 1号线, 位置 1。
在 Azure 中,如果我禁用 RemoveUTF8ByteOrderMark(...) 调用,则文件 A 会正确加载,而文件 B 会出错(如预期的那样)。
当我在我的计算机上进行本地测试时,两个文件都在启用RemoveUTF8ByteOrderMark(...) 的情况下加载,这与我们旧的专用服务器一致。在所有 3 个环境中,XML 文件都是从 Azure blob 存储中提取的,因此始终使用完全相同的文件。
Azure Web App 中发生了什么改变了此代码的运行方式?
更新
在 Azure 中,当调用RemoveUTF8ByteOrderMark(...) 时,我可以看到返回的文本如下:
文件 A
?xml
文件 B
<?xml
那么为什么RemoveUTF8ByteOrderMark(...) 显然会导致领先的< 被剥离?
【问题讨论】:
标签: c# asp.net encoding azure-web-app-service