【问题标题】:reverse proxy in mvcmvc中的反向代理
【发布时间】:2011-03-13 19:12:02
【问题描述】:

我必须在 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;
    }
}

问题出在这个解决方案中,我首先下载文件,然后将下载的文件发送给用户,这不是我想要的。我想在我开始下载文件后立即将文件发送给用户,例如在这个 Online Anonymizer 中 http://bind2.com/

有什么建议可以实现吗?

【问题讨论】:

    标签: asp.net-mvc reverse-proxy


    【解决方案1】:

    上面示例中的以下行:

    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 块的形式复制流 - 您可能希望减小该块的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 2016-04-11
      相关资源
      最近更新 更多