Pregunta

Estoy intentando crear un pequeño servicio de proxy HTTP. Esto no está funcionando tan bien. Es capaz de servir okayish HTML, sin embargo se ahoga en las imágenes. Es decir, algunas imágenes.

Envío en una dirección URL a través de mis rendimientos de proxy 19.4 kb en la respuesta (de acuerdo con firebug) Visitar que url directamente también rinde 19,4 kb en la respuesta, de nuevo según firebug. La diferencia es, que no aparece cuando lo puse a través de mi proxy, pero lo hace cuando hojeo directamente.

Una URL completamente diferente funciona bien. ¿Alguien tiene alguna idea?

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();
}
¿Fue útil?

Solución

Me gustaría probar y al ras / cierre del OutputStream antes de cerrar la respuesta.

También como segunda sugerencia tiene una mirada en el tráfico HTTP desde el sitio original y luego a través de su sitio proxy HTTP utilizando un depurador como el violinista - debe haber una diferencia cuando se utiliza el proxy

.

También para hacer el método más eficaz ReadAll, en general yo evitaría cargar el contenido completo en la memoria, porque esto va a explotar en enormes archivos - sólo transmitir directamente desde el flujo de entrada de la corriente de salida. Si aún desea utilizar matrices de bytes en cuenta lo siguiente (no probado pero debería funcionar):

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();
}

Otros consejos

Puede tratar de sustituir

http.Response.Close();

con

http.Response.Flush();
http.Response.End();

Un problema podría ser que no se especifica el tipo MIME de la respuesta. Browsersthese días están muy indulgente, pero tal vez hay una circunstancia en la que el navegador no sabe cómo manejar lo que está pegando a través de su garganta.

He escrito el servidor http basado en archivos más bien pequeña mayoría, presentan aquí , que por lo que yo recuerdo puede servir imágenes sin mucho problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top