2010-08-03 81 views
0

我们正在使用它来返回文件以进行导出。当我们在很多记录上运行这个输出时,运行时间接近10分钟。这是实际调用File()方法并返回结果的代码的代码片段。ASP.NET MVC FileContentResult SLOW

Public Function Export(ByVal ID As Integer) As FileContentResult 
    Dim str As String = String.Empty 
    Dim data() As Byte 
    Dim r As New ExportResult 
    Dim Test As New TestConnection(WebUtil.UserToken) 

    'This line is important coz IE download was prevented without this. 
    ControllerContext.HttpContext.Response.ClearHeaders() 

    r = Test.ExportFile(ID) 
    data = Encoding.ASCII.GetBytes(r.ResponseString) 

    Return File(data, "text/plain", r.DefaultFileName) 

End Function 

实际导出文件方法需要在一个ID,调用另一个方法,其从数据库中获取一串记录,对每个行一堆计算,然后创建一个StringBuilder,并且对每行填充StringBuilder,然后在执行.ToString()之后将其弹出到List(Of String)中。然后,此方法将List(Of String)返回给ExportFile方法,并且此方法创建另一个StringBuilder,将该列表中的所有Strings附加到该列表,将其转换为一个大String,并将其设置为结果的ResponseString属性('r '在上面的代码中)。

所以这就是它的工作原理。无论如何要加快这个过程,很多吗?

斯科特

编辑:更多的代码

Public Function ExportFile(ByVal ID As Integer) As ExportResult 
      Dim result As New ExportResult 
      Dim s As New StringBuilder 

      'Get all Records 
      Dim dt As New DataTable 
      Using dal As New SQL 
       dal.Parameters.AddWithValue("@ID", ID) 
       dal.Execute("[dbo].[uspGet]", dt) 
       dal.Parameters.Clear() 
      End Using 

      Dim dataobj As New DataObj(dt, ID) 

      'Create FileName 
      If dt.Rows.Count > 0 Then 
       Dim StartDate As DateTime = DateTime.Parse(dt.Rows(0).Item("StartDate")) 
       Dim EndDate As DateTime = DateTime.Parse(dt.Rows(0).Item("EndDate")) 
       result.DefaultFileName = String.Format("HMDA_{0}_{1}.dat", String.Format("{0:MMyyyy}", StartDate), String.Format("{0:MMyyyy}", EndDate)) 
      End If 

      'Add Title Line 
      s.AppendLine(dataobj.CreateTitleLine()) 

      'Add all Record Lines 
      Dim records As List(Of String) = dataobj.CreateRecordLines() 
      Dim last As Integer = records.Count - 1 
      For i = 0 To last 
       If i = last Then 
        s.Append(records(i)) 
       Else 
        s.AppendLine(records(i)) 
       End If 
      Next 

      result.ResponseString = s.ToString 

      Return result 
End Function 

回答

1

如何高性能是SQL?我会开始检查你的问题。

然后考虑你的文件有多大。数据仍然需要在客户端下载。

+0

当我运行操作中使用的SQL查询时,它们立即运行。输出的文件大小为1.16MB(全部文本)。我认为从StringBuilder列表的大规模开始减速,然后当这个列表被附加到一个StringBuilder中,然后运行.ToString()。我只是不知道如何让一切运行得更快。 – Scott 2010-08-03 17:12:43

+0

@Scott,然后发布更多代码。没有人可以优化他们看不到的东西。 – jfar 2010-08-03 17:34:28

+0

刚刚发布了ExportFile()函数的代码。这适用于实际创建对象的类,然后此方法将结果返回到我首先发布的方法。 – Scott 2010-08-03 17:45:18

0

避免多余的副本?也许你可以避免转换为字节和/或创建文件。只需将字符串写入响应中即可,而不需要额外的工作。

+0

所以你说,而不是将其包含在结果中,直接返回它?由于FileContentResult的工作方式,字节转换仍然会发生,但是我在技术上只需要字符串值。我们将其存储在结果中的主要原因是代码可读性。你认为这会大大帮助吗? – Scott 2010-08-03 17:53:47