Asp.net mvc ASP.NET MVC FileContentResult速度慢

Asp.net mvc ASP.NET MVC FileContentResult速度慢,asp.net-mvc,string,file-io,stringbuilder,filecontentresult,Asp.net Mvc,String,File Io,Stringbuilder,Filecontentresult,我们正在使用它返回一个文件进行导出。当我们在很多记录上运行此导出时,运行大约需要10分钟。下面是实际调用File()方法并返回结果的代码片段 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 TestConnecti

我们正在使用它返回一个文件进行导出。当我们在很多记录上运行此导出时,运行大约需要10分钟。下面是实际调用File()方法并返回结果的代码片段

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
实际的ExportFile方法接收一个ID,调用另一个方法,该方法从数据库获取一组记录,对每一行执行一组计算,然后创建一个StringBuilder,并为每一行填充StringBuilder,然后在执行.ToString()后将其弹出到一个列表(字符串)。然后,此方法将(字符串的)列表返回给ExportFile方法,此方法创建另一个StringBuilder,附加该列表中的所有字符串,将其转换为一个大字符串,并将其设置为结果的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

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


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

是否避免额外副本?也许您可以避免转换为字节和/或创建文件。只需将字符串写入响应,而无需做额外的工作。

当我运行操作中使用的SQL查询时,它们会立即运行。输出的文件大小为1.16MB(所有文本)。我认为速度的减慢是由于StringBuilder列表的巨大规模,然后将该列表附加到单个StringBuilder中,然后在其上运行.ToString()。“我只是不知道如何让一切运行得更快。”斯科特,那就多发一些代码吧。没有人可以优化他们看不到的东西。只发布了ExportFile()函数的代码。这适用于实际创建对象的类,然后该方法将结果返回给我首先发布的方法。@Scott,我看到了代码,这里有些可疑。1.1MB的字符串应该不会那么慢。所以你说的不是将其包含在结果中,而是直接返回它?由于FileContentResult的工作方式,字节转换仍然必须进行,但从技术上讲,我只需要字符串值。我们将其存储在结果中的主要原因是代码可读性。你认为这会有很大帮助吗?