如何解析mvc控制器中的文件

时间:2014-08-20 15:10:22

标签: c# asp.net-mvc

我想解析一个xml文件,序列化数据并将其发送给客户端。如您所知,解析文件可能需要一些时间,所以我经常得到例外:

  

[IOException:进程无法访问文件'E:... \ file.xml',因为它正由另一个进程使用。]

我决定在我的动作控制器中添加一个try / catch块。如果有异常,请执行一些thread.sleep并再试一次。我的新代码如下所示:

public PartialViewResult _warningsView(string containerId)
{
    var myXslTrans = new XslCompiledTransform();
    FileStream fileStream = null;
    warnings result = null;
    bool isFileProcessed = false;
    while (!isFileProcessed)
    {
        try
        {
            myXslTrans.Load(Properties.Settings.Default.DataFolder + "/alert.xslt");
            myXslTrans.Transform(Properties.Settings.Default.DataFolder + "/alert.xml", Properties.Settings.Default.DataFolder + "/TransAlert.xml");
            XmlSerializer serializer = new XmlSerializer(typeof(warnings));
            fileStream = new FileStream(Properties.Settings.Default.DataFolder + "/TransAlert.xml", FileMode.Open);
            result = (warnings)serializer.Deserialize(fileStream);

            isFileProcessed = true;
        }
        catch
        {
            Thread.Sleep(100);
        }
        finally
        {
            if (fileStream != null)
            {
                fileStream.Dispose();
            }
        }
    }
      return new Ext.Net.MVC.PartialViewResult
            {
                RenderMode = RenderMode.AddTo,
                ContainerId = containerId,
                Model = result.warningList,
                WrapByScriptTag = false 
            };                
}

这个解决方案对我有用,但我认为它会让我的程序变慢。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

感谢每一个人。 我刚刚找到了这个解决方案:我不是用XslCompiledTransform创建新文件,而是创建临时文件(每个请求的唯一文件名)或MemoryStream。

答案 1 :(得分:0)

是的,在等待机会阅读时睡觉会让你的应用变慢。

看起来你一遍又一遍地读同一个文件。您可以将文件作为嵌入式资源添加到项目中,并以此方式读取。由于您的操作是只读的,因此应该无异常地工作,但可能仍然很慢。

查看此以获取有关此兔洞的更多信息: http://social.msdn.microsoft.com/Forums/en-US/c2d5a464-5a04-4107-9fba-26ff5f8ef720/multiple-access-to-embedded-resources-inside-a-net-assembly?forum=netfxbcl