use*_*822 7 asp.net-mvc reverse-proxy
我必须在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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是在这个解决方案中我首先下载文件,然后将下载文件发送给用户,这不是我想要的.我想在开始下载文件时立即将文件发送给用户,就像在线匿名者一样 http://bind2.com/
任何建议如何实现这一目标?
以上示例中的以下行:
res.Write(reader.ReadToEnd());
Run Code Online (Sandbox Code Playgroud)
相当于:
string responseString = reader.ReadToEnd();
res.Write(responseString);
Run Code Online (Sandbox Code Playgroud)
即,在将整个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);
}
Run Code Online (Sandbox Code Playgroud)
(流复制从最佳方式获取的代码在两个Stream实例之间复制 - C#)
这将以32 KB块的形式复制流 - 您可能希望使此块大小更小.
| 归档时间: |
|
| 查看次数: |
2700 次 |
| 最近记录: |