2016-08-22 4 views
2

Unsere ASP.net App muss einige Anfragen an einen anderen Server weiterleiten, die Daten abrufen und sie bedienen. Wir können die Daten in eine Datei herunterladen und sie bereitstellen oder den Antwort-Stream direkt vom Ursprungsserver zum Client senden. Die Daten umfassen js/css/images/font files/mp3 usw.C# - Schreiben responseStream in context.response.outputstream

HttpWebRequest forwardRequest = (HttpWebRequest)WebRequest.Create(remoteUrl); 

       forwardRequest.ContentType = context.Request.ContentType; 
       forwardRequest.UserAgent = context.Request.UserAgent; 
       forwardRequest.Method = context.Request.HttpMethod; 

       //add post check 

       HttpWebResponse newResponse = (HttpWebResponse)forwardRequest.GetResponse(); 

       MemoryStream ms = new MemoryStream(); 
       newResponse.GetResponseStream().CopyTo(ms); 

       context.Response.ContentType = newResponse.ContentType; 
       context.Response.StatusCode = 200; 
       context.Response.BinaryWrite(ms.GetBuffer()); 
       ms.Close(); 

       context.Response.Flush(); 
       context.Response.Close(); 
       context.Response.End(); 

Wie kann ich newResponse.GetResponseStream()-context.Response.OutputStream direkt übergeben.

+0

Hinweis: '.GetBuffer()' kehrt das ** übergroße ** Backing Array; Ich vermute, dass der 'MemoryStream' hier nicht benötigt wird (und aktiv schädlich ist), aber wenn Sie ihn * brauchen *, sollten Sie nur die ersten' .Length' Bytes von '.GetBuffer()' betrachten - zum Beispiel 'dest.Write (ms.GetBuffer(), 0, (int) ms.Length);' –

Antwort

2

Sie können nicht den Strom direkt passieren, aber man kann einen zum anderen bequem schreiben (die eine Lese-/Schreib-Schleife intern schaffen):

sourceStream.CopyTo(destinationStream); 
+0

Ich hoffe, dass das genau die gleiche Sache tun würde, die passing stream getan hätte, dh Verbesserung der Leistung, ohne zuerst die ganze Datei herunterzuladen –

+0

@ adnankamili gut in der Theorie tut es, aber es hängt davon ab, ob die ** Antwort ** intern puffern; aber ja, eine Read-Write-Schleife (was "CopyTo" tut) kann die Proxy-Verarbeitung der Antwort unterstützen, ohne zuerst alles herunterzuladen. Die 'MemoryStream'-Implementierung hingegen lädt explizit zuerst. –