Отправка изображения с Httplistener работает только для некоторых изображений
-
09-10-2019 - |
Вопрос
Я пытаюсь создать небольшую HTTP -прокси -сервис. Это не работает так хорошо. Он способен подавать HTML OKISH, однако он задыхается на изображениях. То есть некоторые изображения.
Отправка в URL через мой прокси доходность 19,4 КБ в ответе (согласно Firebug), посещая этот URL, также дает 19,4 т.п.н. в ответ, опять же, согласно Firebug. Разница в том, что она не появляется, когда я проведу его через свой прокси, но это происходит, когда я просматриваю напрямую.
Совершенно другой 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 Debugger Скрипач - Должно быть разница при использовании вашего прокси.
Кроме того, чтобы сделать метод 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();
}
Другие советы
Вы можете попытаться заменить
http.Response.Close();
с
http.Response.Flush();
http.Response.End();
Проблема может заключаться в том, что вы не указываете тип ответа MIME. Браузеры очень прощают, но, возможно, есть обстоятельства, когда браузер не знает, как справляться с тем, что вы проливаете в горле.
Я написал самый маленький HTTP-сервер на основе файлов, Представлено здесь, что, насколько я могу помнить, может обслуживать изображения без особых проблем.