在我的ASP.NET Web 窗体应用程序中,我必须让用户下载 XML 文件。为了做到这一点,当他们按下下载按钮时,会执行以下代码:
Response.Clear()
Response.CacheControl = "Private"
Response.Cache.SetExpires(DateTime.Now.AddMinutes(3))
Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1")
Response.ContentType = "text/xml"
Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}.xml", fileName))
Dim xmlFile As String = _xmlServices.GetXmlFile(fileId);
If Not String.IsNullOrEmpty(xmlFile) Then
Dim xdoc As XmlDocument = New XmlDocument()
xdoc.LoadXml(xmlFile)
xdoc.Save(Response.Output)
End If
Response.Flush()
Response.End()
该GetXmlFile(fileId)
函数返回一个包含 XML 的字符串。获得的字符串已经具有指定的编码 ( <?xml version="1.0" encoding="ISO-8859-1"?>
) 和签名。这意味着如果文件被修改,签名将不再有效。
GetXmlFile(fileId)
我对WPF 应用程序使用相同的功能,它运行良好。
然而,在我的 ASP.NET 应用程序中,我有两个问题:
如果我没有明确指定
Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1")
下载的 XML 文件有编码<?xml version="1.0" encoding="UTF-8"?>
。这不是一个大问题。从ASP.NET 应用程序下载的 XML 文件比从WPF 应用程序下载的文件多一个回车符。这些文件可能看起来与解析相同,因为回车出现在标记的末尾,而不会影响数据。但签名无效,因为文件在放置后已更改。
因此,我认为Response.Output
流以某种方式修改了文件。或者这个错误背后可能有另一个原因?