Самый быстрый способ доставки изображений через asp.net - PullRequest
2 голосов
/ 28 января 2009

Мне интересно, какой способ быстрее всего доставлять изображения через ASP.net:

//get file path
string filepath = GetFilePath();
Response.TransmitFile(f);

или

string filepath = GetFilePath();
context.Response.WriteFile(f);

или

Bitmap bmp = GetBitmap()
bmp.Save(Response.OutputStream);

или любой другой метод, который вы можете придумать

Ответы [ 6 ]

3 голосов
/ 28 января 2009

TransmitFile масштабируется лучше, так как не загружает файл в память приложения .

Вам нужно протестировать большие файлы изображений, чтобы увидеть видимую разницу, но TransmitFile выведет результат WriteFile.

В любом случае вы должны использовать обработчик ashx, а не страницу aspx для обслуживания изображения. У aspx есть дополнительные издержки, которые не нужны.

Еще одна вещь - установите ContentType при отправке файла, иначе браузер может отобразить его как двоичный код. В случае BMP:

context.Response.ContentType = "изображение / ВМР";

1 голос
/ 28 января 2009

Это на самом деле не отвечает на ваш вопрос, но asp не является файловым сервером, если вы хотите обслуживать файлы, используйте IIS и получаете Asp для связи с этими файлами, или если вы должны использовать ASP, используйте его для перенаправления в соответствующее место .

Я не говорю, что это невозможно, но если вы беспокоитесь о производительности, вы можете пойти по другому пути.

Из методов, которые у вас есть, я думаю, что растровое изображение будет самым медленным, так как оно создает более сложный объект.

MS , кажется, имеет достойное решение, если вы должны сделать это через asp.

0 голосов
/ 28 января 2009

Я полагаю, что вы хотите сделать это либо из соображений безопасности, либо для записи метрик определенного типа (например, запись каждого попадания в базу данных, чтобы выяснить, какое изображение наиболее популярно или кто просматривает изображение и т. Д.) или для целей перезаписи URL. Если нет особой причины использовать ASP.NET для обслуживания образа, вам следует просто позволить IIS позаботиться об этом, как отметили другие.

Также - это не отвечает на ваш вопрос о том, какой метод наиболее эффективен при чтении файла изображения с диска, но я подумал, что должен указать на это:

Если у вас уже есть поток или растровое изображение, содержащее изображение, используйте его для прямой записи в Response.OutputStream. Вы определенно хотите избежать записи на диск и последующего чтения с диска, если у вас уже есть Stream.

0 голосов
/ 28 января 2009

По моему опыту, используйте TransmitFile (), если это единственное, что вы намереваетесь отправить, и звучит так, как оно есть.

Обратите внимание, что это несовместимо с файлами ASPX с поддержкой AJAX.

0 голосов
/ 28 января 2009

Ну, одно можно сказать наверняка - это НЕ будет так же быстро, как позволить IIS серверу файл. Если маршрутизировать запрос через asp.net вместо того, чтобы IIS обслуживал его, вы вводите кучу накладных расходов, которые вам не нужны.

Единственная причина, по которой я могу представить себе маршрутизацию через asp.net, это в целях безопасности; это тот случай?

0 голосов
/ 28 января 2009

Тестирование достаточно просто, я рекомендую вам настроить три разных URL-адреса, которые будут проверять различные механизмы, а затем иметь клиент (экземпляр HttpWebRequest / HttpWebResponse или WebClient), загружающий контент со всех них. Используйте экземпляр секундомера для определения времени загрузки.

Я полагаю, что это не имеет значения, что сетевая задержка будет превышать задержку ввода-вывода (если вы не перебиваете жесткий диск все время) большую часть времени.

...