提供XML文件供asp.net c#中的大量记录下载
发布时间:2020-12-16 23:31:40 所属栏目:百科 来源:网络整理
导读:我需要提供xml文件以便下载6,00,000条记录(数据可能会增加)但不允许将文件保存在磁盘上. 我直接将xml写入stream然后提供下载,所以我首先在磁盘上创建了xml文件将数据写入其中并尝试在byes中读取数据提供下载,然后从磁盘中删除文件.但是要获得“system.outofm
我需要提供xml文件以便下载6,00,000条记录(数据可能会增加)但不允许将文件保存在磁盘上.
我直接将xml写入stream&然后提供下载,所以我首先在磁盘上创建了xml文件&将数据写入其中并尝试在byes&中读取数据提供下载,然后从磁盘中删除文件.但是要获得“system.outofmemoryexception” “Byte [] b = File.ReadAllBytes(filepath);”. 以下是我的代码: string name = string.Format("{0:yyyyMMddHHmmss}",DateTime.Now); string filename = "TestFile.xml"; string filepath = ConfigurationManager.AppSettings["XmlFiles"] + "" + filename; DataTable dataTable = dsData.Tables[0]; FileStream fs =new FileStream(filepath,FileMode.Create); XmlWriterSettings xws = new XmlWriterSettings { OmitXmlDeclaration = true }; using (XmlWriter xmlWriter = XmlWriter.Create(fs,xws)) { xmlWriter.WriteStartElement("root"); foreach (DataRow dataRow in dataTable.Rows) { xmlWriter.WriteStartElement("datanode"); foreach (DataColumn dataColumn in dataTable.Columns) { xmlWriter.WriteElementString(dataColumn.ColumnName.Replace("nr"," ") .Replace("n"," ").Replace("r"," "),Convert.ToString(dataRow[dataColumn]).Replace("nr"," ").Replace("n"," ")); } xmlWriter.WriteEndElement(); } xmlWriter.WriteEndElement(); xmlWriter.Flush(); xmlWriter.Close(); } fs.Close(); Byte[] b = File.ReadAllBytes(filepath); if (File.Exists(filepath)) File.Delete(filepath); string s = string.Format("{0:yyyyMMddHHmmss}",DateTime.Now); HttpContext.Current.Response.ContentType = "application/xml"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8; HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment; filename=" + s + ".xml" + ""); HttpContext.Current.Response.BinaryWrite(b); HttpContext.Current.Response.End(); 还有其他方法可以处理大量记录吗? 解决方法
您可以直接将XmlWriter连接到Response
OutputStream,而无需中间文件.通过将
BufferOutput设置为false,可以防止完整的repsonse在发送到客户端之前缓冲服务器端.
请注意,多个Replace语句将导致额外的内存压力/更多字符串被GC编辑. string name = string.Format("attachment; filename={0:yyyyMMddHHmmss}.xml",DateTime.Now); HttpContext.Current.Response.ContentType = "application/xml"; HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8; HttpContext.Current.Response.BufferOutput = false; //start streaming immideately HttpContext.Current.Response.AppendHeader("Content-Disposition",name); DataTable dataTable = dsData.Tables[0]; XmlWriterSettings xws = new XmlWriterSettings { OmitXmlDeclaration = true }; using (XmlWriter xmlWriter = XmlWriter.Create( HttpContext.Current.Response.OutputStream,// The OutputStream of the HttpResponse xws)) { xmlWriter.WriteStartElement("root"); var cleanedColNames = new Dictionary<DataColumn,string>(); foreach (DataColumn dataColumn in dataTable.Columns) { cleanedColNames.Add(dataColumn,dataColumn.ColumnName.Replace("nr"," ") .Replace("n"," ") .Replace("r"," ")); } foreach (DataRow dataRow in dataTable.Rows) { xmlWriter.WriteStartElement("datanode"); foreach (DataColumn dataColumn in dataTable.Columns) { xmlWriter.WriteElementString( cleanedColNames[dataColumn]," ") .Replace("n"," ") .Replace("r"," ")); } xmlWriter.WriteEndElement(); } xmlWriter.WriteEndElement(); xmlWriter.Flush(); xmlWriter.Close(); } HttpContext.Current.Response.End(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |