编程语言
首页 > 编程语言> > c#-使用HttpListener发送图像仅适用于某些图像

c#-使用HttpListener发送图像仅适用于某些图像

作者:互联网

我正在尝试创建一个小的http代理服务.这不是很好.它可以提供HTML正常功能,但会阻塞图像.即,一些图像.

通过我的代理发送一个url会在响应中产生19.4 kb(根据firebug)
同样,根据firebug,直接访问该URL也会在响应中产生19.4 kb.区别在于,当我通过代理将其显示时,它不会显示,但是当我直接浏览时,它会显示.

完全不同的url可以正常工作.有人有什么主意吗?

private void DoProxy()
{
    var http = listener.GetContext();
    string url = http.Request.QueryString["url"];
    WebRequest request = HttpWebRequest.Create(url);
    WebResponse response = request.GetResponse();
    http.Response.ContentType = response.ContentType;

    byte[] content;
    using (Stream responseStream = response.GetResponseStream())
        content = ReadAll(responseStream);
    http.Response.ContentLength64 = content.Length;
    http.Response.OutputStream.Write(content, 0, content.Length);
    http.Response.Close();
}

private byte[] ReadAll(Stream stream)
{
    IList<byte> array = new List<byte>();
    int b;
    while ((b = stream.ReadByte()) != -1)
        array.Add(Convert.ToByte(b));
    return array.ToArray();
}

解决方法:

在关闭响应之前,我会尝试刷新/关闭OutputStream.

另外一个建议是,查看原始站点的HTTP流量,然后使用HTTP调试器(如Fiddler)通过代理站点,查看HTTP流量-使用代理时一定有所不同.

另外,为了使ReadAll方法更有效,通常,我将避免将全部内容加载到内存中,因为这会在庞大的文件上爆炸-只需将它们直接从输入流传输到输出流即可.如果仍然要使用字节数组,请考虑以下内容(未经测试,但应该可以使用):

private byte[] ReadAll(Stream stream)
{
    byte[] buffer = new byte[8192];
    int bytesRead = 1;
    List<byte> arrayList = new List<byte>();

    while (bytesRead > 0)
    {
        bytesRead = stream.Read(buffer, 0, buffer.Length);
        arrayList.AddRange(new ArraySegment<byte>(buffer, 0, bytesRead).Array);
    }
    return arrayList.ToArray();
}

标签:httplistener,c
来源: https://codeday.me/bug/20191208/2094400.html