可能有一些非常简单的答案,但我真的坚持这个。
我编写了一些代码,通过 ftp 获取相当大的 (4GB+) xml 文件,将其作为字符串读取并将文档拆分为较小的部分。最后将较小的文件写入磁盘。
在我的开发人员机器上一切都运行良好,但是当投入生产时,脚本在仅读取了文件的十分之一后突然结束。不抛出异常。每一行代码都按预期执行。它只是在遍历整个文件之前结束。这让我觉得是一些 IIS 或 web.config 设置需要被篡改。
代码在 Umbraco CMS 中作为自定义用户控件运行。服务器是运行 IIS 的 2008 Windows 机器。
有任何想法吗?这是代码:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.Credentials = new NetworkCredential("anonymous", "x@y.z");
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Timeout = -1;
request.KeepAlive = true;
request.UsePassive = true;
request.UseBinary = true;
using (response = (FtpWebResponse)request.GetResponse())
using (responseStream = response.GetResponseStream())
using (StreamReader sr = new StreamReader(responseStream))
{
ReadStreamIntoNewRecord(fileName, sr, ref progress, ref result);
}
ReadStreamIntoNewRecord 函数如下所示:
private void ReadStreamIntoNewRecord(string fileName, StreamReader sr, int NumberOfRecordsPerBatch)
{
string line = "";
string record = "";
int i = 0;
XDocument xdoc = new XDocument(new XElement("collection"));
while (sr.Peek() >= 0)
{
line = sr.ReadLine();
if (line.Contains("</record>"))
{
xdoc.Element("collection").Add(MakeRecordFromString(record + line));
record = "";
i++;
if (i % NumberOfRecordsPerBatch == 0)
{
SaveRecordToFile(fileName, xdoc);
xdoc = new XDocument(new XElement("collection"));
}
}
else
{
record = record + line;
}
}
SaveRecordToFile(fileName, xdoc);
}