MVC OutOfMemoryException-Handling

时间:2015-03-17 08:04:20

标签: c# asp.net-mvc

我有一个MVC应用程序,它在数据库中搜索条目列表。有时有很多我无法在浏览器中显示它们所以我只想显示Top100,如果需要,可以在csv文件中导出它们以在Excel中打开它们。

在大多数情况下效果很好,但现在我遇到一个问题,那就是我的系统可以处理更多的条目,并且我得到一个OutOfMemoryException。

我现在的问题是我想向我的程序的用户显示有很多条目并且它不能在文件中打开它们但我的Method有一个返回值FileStreamResult。如何在视图/浏览器中向用户显示错误说明?或者你知道一个更好的解决方案来处理OutOfMemoryException吗?

这是抛出Exetption的方法。它发生在第四行“artikel.ToList();”:

public FileStreamResult DownloadCSV(string agraCd, string agrCd)
    {
        using (var entities = new RS2_XENTESTEntities())
        {
            var artikel = Select(entities, agraCd, agrCd);

            var artikelliste = artikel.ToList();

            MemoryStream output = new MemoryStream();
            StreamWriter writer = new StreamWriter(output, Encoding.UTF8);
            writer.Write("Artikelnummer;");
            writer.Write("Kurzbezeichnung;");
            writer.Write("Bezeichnung1;");
            writer.Write("Status;");
            writer.Write("Einheit;");
            writer.Write("Notiz");
            writer.WriteLine();
            foreach (var order in artikelliste)
            {
                //Artikelnummer – Art_nr
                writer.Write(order.ART_NR + ";");
                //Kurzbezeichnung – Art_kbez
                writer.Write(order.ART_KBEZ + ";");
                //Bezeichnung 1 – Art_bez1
                writer.Write(order.ART_BEZ1 + ";");
                //Status – Art_status
                writer.Write(order.ART_STATUS + ";");
                //Einheit – Meh_cd
                writer.Write(order.MEH_CD + ";");
                //Notiz – Art_notiz
                if (order.ART_NOTIZ != null)
                {
                    order.ART_NOTIZ = order.ART_NOTIZ.Replace(System.Environment.NewLine, " ");
                }
                writer.Write(order.ART_NOTIZ);

                writer.WriteLine();
            }

            writer.Flush();
            output.Position = 0;


            return File(output, "text/csv", "Export.csv");
        }
    }

1 个答案:

答案 0 :(得分:2)

编辑:哦,没有看到你的输出是一个MemoryStream ...也许你可以返回某种(Http)响应,你可以写入输出。

你的OOM异常会在第

行加注
var artikelliste = artikel.ToList();

...因为.ToList()实际上会调用您的存储库并将每个对象都放入内存中。我不知道你的select方法,但我认为,它返回一个IEnumerable或某种类型的读者?你可以使用这个阅读器或IEnumerable(不要调用ToList())它可以工作(取决于你的Select实现)。