我必须在mvc中实现类似代理的功能,以发送另一台服务器上的用户文件。我找到了这堂课:
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;
}
}
问题在于此解决方案我首先下载文件,然后将下载文件发送给用户,而不是我想要的。我想在开始下载文件时立即将文件发送给用户,就像在这个在线匿名者中一样 http://bind2.com/
有任何建议如何实现这一目标?
答案 0 :(得分:8)
以上示例中的以下一行:
res.Write(reader.ReadToEnd());
相当于:
string responseString = reader.ReadToEnd();
res.Write(responseString);
即。整个Web响应正在下载并存储在字符串中,然后再传递给客户端。
相反,您应该使用以下内容:
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);
}
(流复制代码取自Best way to copy between two Stream instances - C#)
这将以32 KB块的形式复制流 - 您可能希望将此块大小缩小。