在我的 ASP.NET Web Forms 应用程序中,我必须让用户下载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"?>
)和签名。这意味着如果文件被修改,签名就不再有效了。
我对 WPF应用程序使用相同的函数GetXmlFile(fileId)
,它完美无缺。
在我的ASP.NET应用程序中,我有两个问题:
如果我没有明确指定Response.ContentEncoding =
Encoding.GetEncoding("ISO-8859-1")
,则下载的XML文件具有编码<?xml version="1.0" encoding="UTF-8"?>
。这不是一个大问题。
从 ASP.NET应用程序下载的XML文件比从 WPF应用程序下载的文件多一个回车符。这些文件可能看起来与解析相同,因为回车符出现在标记的末尾,而不会影响数据。但签名无效,因为文件在放置后已被更改。
因此,我认为Response.Output
流以某种方式修改了文件。或者这个错误背后可能有另一个原因?