mvc中的反向代理

时间:2011-03-13 19:12:02

标签: 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;
    }
}

问题在于此解决方案我首先下载文件,然后将下载文件发送给用户,而不是我想要的。我想在开始下载文件时立即将文件发送给用户,就像在这个在线匿名者中一样  http://bind2.com/

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

1 个答案:

答案 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块的形式复制流 - 您可能希望将此块大小缩小。