【问题标题】:How to parse files in mvc controller如何在 mvc 控制器中解析文件
【发布时间】:2014-08-20 15:10:22
【问题描述】:

我想解析一个 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 
            };                
}

这个解决方案对我有用,但我认为它会使我的程序变慢。有没有更好的方法来做到这一点?

【问题讨论】:

  • 为什么文件有时会被另一个进程使用?我会对此进行调查,而不是在控制器方法中使用 Sleep()。
  • 正如 West 所说...或者如果您出于某种正当理由无法停止使用它,也许您可​​以获取 xml 文件的临时副本并进行处理?即不要使用文件流,如果文件不是太大,可能会将整个文件加载到内存中。
  • 应该使用 memoryStream 进行转换或使用 tempFile。
  • 所有客户端同时调用_warningsView方法。所以 TransAlert.xml 文件账单会同时被多个线程处理
  • 你的xml文件更新了吗?那是你收到错误的时候吗?

标签: c# asp.net-mvc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    是的,在等待阅读机会时睡觉会使您的应用变得非常缓慢。

    您似乎在一遍又一遍地读取同一个文件。您可以将该文件作为嵌入式资源添加到您的项目中并以这种方式读取它。由于您的操作是只读的,它应该可以正常工作,但可能仍然很慢。

    在这个兔子洞里查看更多信息: http://social.msdn.microsoft.com/Forums/en-US/c2d5a464-5a04-4107-9fba-26ff5f8ef720/multiple-access-to-embedded-resources-inside-a-net-assembly?forum=netfxbcl

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 1970-01-01
      • 2018-03-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2013-12-05
      相关资源
      最近更新 更多