Ist das FileStreamResult von ASP.NET MVC weniger effizient als das direkte Schreiben in den Antwortausgabestream, oder fehlt mir etwas?

Zuallererst ichLiebe ASP.NET MVC. Diese Frage ist keine Kritik daran. Ich möchte vielmehr bestätigen, was ich zu sehen glaube, und sicherstellen, dass ich nichts verpasst habe. Nehmen Sie mich mit ... Ich komme nicht auf die Frage, ohne ein wenig Kontext anzugeben.

Die Frage hat mit der Rückgabe von Daten in einem Stream als Antwort auf einen HTTP-Beitrag zu tun. In früheren Zeiten vor ASP.NET MVC konnten Sie dies tun, indem Sie Ihre Daten direkt in den Response-Stream weiterleiteten. Zum Beispiel könnten Sie so etwas tun:

someObjectThatDumpsOutputToWhateverStreamYouHandIt.WriteTo(Response.OutputStream); 

Beachten Sie einen wichtigen Aspekt dieses Codes: Ich habe nicht implementiertIRGENDEIN Backing Store. Ich musste die Informationen nicht in ein Byte-Array streamen oder in eine temporäre Datei kopieren. Vielmehr hatte ASP.NET bereits einen Stream eingerichtet, um die Antwort an den Browser zurückzusenden, und ich habe die gewünschte Ausgabe direkt in diesen Stream abgelegt. Dies ist in Bezug auf CPU, Arbeitsspeicher und Ausführungszeit effizienter als das Kopieren aller Daten an einen temporären Speicherort und das anschließende Verschieben in den Antwortdatenstrom.

Es ist jedoch nicht sehr freundlich zu Unit-Tests. Tatsächlich können Sie diese Art von Code immer noch in ASP.NET MVC ausführen, dies sollte jedoch vermieden werden. ASP.NET MVC fordert Sie vielmehr auf, ein ActionResult zurückzugeben. Das ActionResult ist ein ASP.NET-MVC-Konzept, das vor allem für Unit-Tests geeignet ist. Sie können damit "deklarieren", was Sie tun möchten. Ein Komponententest kann eine Controller-Aktion ausführen und bestätigen, dass sie das erwartete ActionResult erhält. Dieser Komponententest kann außerhalb eines Browsers ausgeführt werden.

ASP.NET MVC bietet eine Art ActionResult für die Rückgabe von Datenströmen. Es heißt FileStreamResult. Lassen Sie sich nicht vom Wort "Datei" im Namen täuschen. Es geht um die Rückgabe eines Datenstroms, genau wie oben beschrieben.

Hier ist jedoch das Problem und die Grundlage meiner Frage:Wenn Sie mit Ihrer Controller-Methode ein FileStreamResult zurückgeben und einen Stream übergeben, den Sie zurückgeben möchten, können Sie die Daten anscheinend nicht mehr direkt in den Response-Stream sichern. Es sieht so aus, als ob Sie gezwungen sind, einen eigenen Stream mit einem Sicherungsspeicher (z. B. Speicher oder eine Datei) zu erstellen, Ihre Daten darin abzulegen und diesen Stream dann an das von Ihnen zurückgegebene FileStreamResult zu übergeben.

Es scheint also, dass ich so etwas tun muss (absichtlich nicht entsorgen / verwenden / etc.):

MemoryStream myIntermediateStream = new MemoryStream();
someObjectThatDumpsOutputToWhateverStreamYouHandIt.WriteTo(myIntermediateStream ); 

return new FileStreamResult(myIntermediateStream, "application/pdf");

Beachten Sie, dass myIntermediateStream bewirkt, dass der Inhalt des großen Datenstroms vorübergehend im Speicher gespeichert wird, sodass FileStreamResult ihn später erneut in den Antwortausgabestream kopieren kann.

Hier ist meine Frage: Habe ich etwas übersehen oder ist es richtig zu sagen, dass Sie mit FileStreamResult einen Zwischenspeicherort benötigen, den Sie nicht benötigen würden, wenn Sie direkt in den Ausgabestream der Antwort schreiben würden?

Vielen Dank.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage