尝试读取xml文件时的ASP.Net,"在不存在的网络连接上尝试了操作"

Pau*_*0PT 11 c# xml asp.net azure

string url = "http://www.example.com/feed.xml";
var settings = new XmlReaderSettings();
settings.IgnoreComments = true;
settings.IgnoreProcessingInstructions = true;
settings.IgnoreWhitespace = true;
settings.XmlResolver = null;
settings.DtdProcessing = DtdProcessing.Parse;
settings.CheckCharacters = false;
var request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 900000;
request.KeepAlive = true;
request.IfModifiedSince = lastModified;
var response = (HttpWebResponse)request.GetResponse();
Stream stream;
stream = response.GetResponseStream();
stream.ReadTimeout = 600000;
var xmlReader = XmlReader.Create(stream, settings);

while (!xmlReader.EOF)
{
...
Run Code Online (Sandbox Code Playgroud)

当我在一个大的xml文件上尝试这个(下载速度也很慢)时,我的azure web应用程序会在几分钟后抛出一个空白页面.

我在Azure的失败请求跟踪日志中看到了这个:

ModuleName:DynamicCompressionModule

通知:SEND_RESPONSE

HttpStatus:500

HttpReason:内部服务器错误

HttpSubStatus:19

ErrorCode:尝试对不存在的网络连接执行操作.(0x800704cd)

正如你所看到的,我一直在玩"超时设置".还尝试捕获所有异常,但它没有捕获任何.

此外,在我的计算机上本地调试Web应用程序时,这没有问题.可能是我办公室的互联网连接比Azure更好,导致xml文件快速读取而没有任何问题.

任何可能的解决方法?编辑:我想继续流式传输XML文件(我避免下载整个文件,因为用户可以选择只读取Feed的前N个条目).如果无法避免上述问题,我很高兴有人可以帮助我至少向用户显示有意义的消息,而不是空白页.

swe*_*ner 1

你可以只使用

string url = "http://www.example.com/feed.xml";
using(var reader = XmlReader.Create(url){
Run Code Online (Sandbox Code Playgroud)

它应该可以工作,因为 url 受支持(请参阅此处)。然后可以通过yield return x. 这可能是您最好的选择,因为您可以让本机组件按照它想要的方式处理流。您甚至可以通过 ReadValueChunk 方法对文件进行分块。

另一个考虑因素(我猜也是问题所在)是 Azure 实例的大小。众所周知,Azure 实例的内存量非常小,除非位于最高层。

我也没有看到您处理任何流,这也可能导致内存泄漏和内存使用过多。

考虑到它可以在您的计算机上运行,​​并且大多数个人计算机至少与 A3 实例(顶部以下一层)一样强大,并且有一个 IDE 可以在本地清理任何内存泄漏,并且 azure 实例似乎是可行的可能是问题所在。

一种潜在的解决方案是使用文件流。内存流和文件流在一定大小之后非常相似。一个使用文件系统,而另一个使用 sys 文件(IIRC pagefile.sys),因此转换为文件流对性能影响不大,缺点是完成后必须清理文件。但当考虑到美元时,磁盘流在蔚蓝世界中更便宜。