Domanda

Sto cercando di creare un piccolo servizio proxy http. Questo non funziona così bene. E 'in grado di servire okayish HTML, tuttavia soffoca su immagini. Cioè, alcune immagini.

L'invio di un URL attraverso i miei rendimenti procura 19.4 kb nella risposta (secondo Firebug) Visitando l'URL direttamente produce anche 19,4 kb nella risposta, sempre secondo Firebug. La differenza è che non si presenta quando ho messo attraverso il mio proxy, ma lo fa quando navigo direttamente.

Un URL completamente diverso funziona bene. Qualcuno ha qualche 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();
}
È stato utile?

Soluzione

Vorrei provare a filo / chiudere il OutputStream prima di chiudere la risposta.

Anche come secondo suggerimento ha uno sguardo al traffico HTTP dal sito originale e poi attraverso il vostro sito proxy utilizzando un HTTP debugger come Fiddler - ci deve essere una differenza quando si utilizza il proxy

.

Anche per rendere il metodo ReadAll più efficace, in generale, vorrei evitare di caricare l'intero contenuto nella memoria, perché questo farà saltare in aria su file di grandi dimensioni - solo lo streaming direttamente dal flusso di input nel flusso di output. Se si vuole ancora array di byte uso considerare quanto segue (non testato, ma dovrebbe funzionare):

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

Altri suggerimenti

Si può cercare di sostituire

http.Response.Close();

con

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

Un problema potrebbe essere che non si specifica il tipo MIME della risposta. giorni Browsersthese sono molto indulgente, ma forse c'è una circostanza in cui il browser non sa come gestire tutto ciò che stanno attaccando attraverso la sua gola.

Ho scritto più server HTTP basato su file piuttosto piccolo, presentato qui , che per quanto ne ricordo può servire immagini senza molto problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top