I have to implement something like proxy in mvc to send user file that is on another server . I found this class :
public class ProxyHandler : IHttpHandler, IRouteHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
string str = "http://download.thinkbroadband.com/100MB.zip";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(str);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
HttpResponse res = context.Response;
res.Write(reader.ReadToEnd());
}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return this;
}
}
The problem is in this solution i first download file and then send downloded file to user with is not what i want. I want to send file to user as soon as I start to download it like in this Online Anonymizer for example http://bind2.com/
Any suggestions how to achieve this?
The following line in the above sample:
res.Write(reader.ReadToEnd());
Is equivalent to:
string responseString = reader.ReadToEnd();
res.Write(responseString);
I.e. the entire web response is being downloaded and stored in a string before it is being passed to the client.
Instead you should use something like the following:
Stream responseStream = response.GetResponseStream();
byte[] buffer = new byte[32768];
while (true)
{
int read = responseStream.Read(buffer, 0, buffer.Length);
if (read <= 0)
return;
context.Response.OutputStream.Write(buffer, 0, read);
}
(Stream copying code taken from Best way to copy between two Stream instances - C#)
This copies the stream in 32 KB chunks - you may want to make this chunk size smaller.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With