ASP.NET MVC FileContentResult SLOW - PullRequest
       18

ASP.NET MVC FileContentResult SLOW

0 голосов
/ 03 августа 2010

Мы используем его для возврата файла для экспорта. Когда мы запускаем этот экспорт для большого количества записей, это занимает около 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 принимает идентификатор, вызывает другой метод, который получает кучу записей из базы данных, выполняет кучу вычислений для каждой строки, а затем создает StringBuilder, и для каждой строки заполняет StringBuilder и затем вставляет его в List (Of String) после выполнения .ToString (). Затем этот метод возвращает List (Of String) в метод 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

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Насколько эффективен ваш SQL?Я бы начал там проверять твои проблемы.

Тогда подумайте, насколько велик ваш файл.Данные все еще должны быть загружены на клиенте.

0 голосов
/ 03 августа 2010

Избегать лишних копий? Может быть, вы можете избежать преобразования в байтах и ​​/ или создания файла. Просто напишите строку с ответом без этой дополнительной работы.

...