mvc中的反向代理

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/

任何建议如何实现这一目标?

Jus*_*tin 8

以上示例中的以下行:

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块的形式复制流 - 您可能希望使此块大小更小.