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个条目).如果无法避免上述问题,我很高兴有人可以帮助我至少向用户显示有意义的消息,而不是空白页.
你可以只使用
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),因此转换为文件流对性能影响不大,缺点是完成后必须清理文件。但当考虑到美元时,磁盘流在蔚蓝世界中更便宜。
归档时间: |
|
查看次数: |
786 次 |
最近记录: |