0

Nous l'utilisons pour renvoyer un fichier pour une exportation. Lorsque nous exécutons cette exportation sur un grand nombre d'enregistrements, l'exécution prend près de 10 minutes. Voici un extrait de code du code qui appelle réellement la méthode File() et renvoie le résultat.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 

La méthode ExportFile réelle prend dans un ID, appelle une autre méthode, qui obtient un tas d'enregistrements de la base de données, effectue un tas de calculs sur chaque ligne, et crée ensuite un StringBuilder, et pour chaque Remplit de ligne StringBuilder, puis le place dans une liste (Of String), après avoir fait un .ToString(). Ensuite, cette méthode retourne List (Of String) à la méthode ExportFile et cette méthode crée un autre StringBuilder, ajoute toutes les chaînes de cette liste, la convertit en une grande chaîne et la définit sur la propriété ResponseString du résultat ('r 'dans le code ci-dessus).

Voilà comment cela fonctionne. Y a-t-il moyen d'accélérer ce processus, par exemple, beaucoup?

-Scott

Edit: Plus code

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 

Répondre

1

Comment est votre SQL performant? Je commencerais à vérifier là pour vos problèmes.

Ensuite, considérez la taille de votre fichier. Les données doivent encore être téléchargées chez le client.

+0

Lorsque j'exécute les requêtes SQL utilisées dans les opérations, elles s'exécutent instantanément. Le fichier en sortie a une taille de 1,16 Mo (tout le texte). Je pense que le ralentissement vient de la taille massive de la liste StringBuilder, et ensuite lorsque cette liste est ajoutée dans un seul StringBuilder et que .ToString() s'exécute dessus. Je ne sais pas comment faire pour que tout fonctionne plus vite. – Scott

+0

@Scott, Post plus de code alors. Personne ne peut optimiser quelque chose qu'ils ne peuvent pas voir. – jfar

+0

Juste posté le code de la fonction ExportFile(). Cela fonctionne avec la classe qui crée réellement l'objet, puis cette méthode renvoie le résultat à la méthode que j'ai publiée en premier. – Scott

0

Évitez les copies supplémentaires? Peut-être que vous pouvez éviter la conversion en octets et/ou la création si le fichier. Il suffit d'écrire la chaîne à la réponse sans ce travail supplémentaire.

+0

Donc, votre dicton au lieu de l'inclure avec le résultat, il suffit de le retourner directement? La conversion d'octets devrait toujours se produire en raison de la façon dont fonctionne FileContentResult, mais techniquement, je n'ai besoin que de la valeur String. La principale raison pour laquelle nous l'avons stocké dans le résultat était la lisibilité du code. Vous pensez que cela va aider drastiquement? – Scott