HTTPlistenerで画像を送信して、一部の画像でのみ動作します
-
09-10-2019 - |
質問
小さなHTTPプロキシサービスを作成しようとしています。これはあまりうまく機能していません。 HTML Okeishを提供することができますが、画像に詰まっています。つまり、いくつかの画像です。
プロキシを介してURLを送信すると、応答中に19.4 kbが得られます(Firebugによると)urlが直接訪問すると、firebugによると、応答が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
応答を閉じる前に。
また、2番目の提案として、元のサイトからのHTTPトラフィックを見て、次にhttpデバッガーを使用してプロキシサイトを介して見てみましょう。 フィドラー - プロキシを使用する場合、違いがなければなりません。
また、readallメソッドをより効果的にするために、一般に、完全なコンテンツをメモリにロードすることを避けます。これは巨大なファイルに爆発するため、入力ストリームから出力ストリームに直接ストリーミングするだけです。それでもbyteアレイを使用したい場合は、次のものを検討します(テストされていないが、機能するはずです)。
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();
}
他のヒント
交換してみることができます
http.Response.Close();
と
http.Response.Flush();
http.Response.End();
問題は、応答のMIMEタイプを指定しないことです。ブラウザー日は非常に寛容ですが、ブラウザが喉にこだわっているものをどのように処理するかを知らない状況があるかもしれません。
最も小さいファイルベースのHTTPサーバーを書きました。 ここに提示されます, 、私が覚えている限り、それは問題なく画像を提供することができます。