ASP.NET MVC медленная загрузка изображений через MVC framework? - PullRequest
5 голосов
/ 12 августа 2010

На какой-то странице фотокниги я хочу показать около 20 миниатюр.Эти миниатюры программно загружаются из базы данных.эти эскизы уже изменены.Когда я показываю им, изображения загружаются довольно медленно.некоторым требуется 0,5 секунды, чтобы загрузить, некоторые ждут 2 секунды.База данных не имеет значения, потому что, когда я удаляю слой базы данных, проблема производительности все еще существует. Когда я загружаю те же самые изображения непосредственно с html, проблема, которую изображения загружают немедленно.

Идет ли медленная загрузка изображений / файлов через инфраструктуру mvc или я что-то упускаю?

Это происходит слишком медленно

//in html
<img src='/File/Image.jpg' border='0'>                    

//in controller
public FileResult File(string ID)
{           
    //database connection removed, just show a pic
    byte[] imageFile = System.IO.File.ReadAllBytes(ID);
    return new FileContentResult(imageFile,"image/pjpeg");
}

Это происходит немедленно

<img src='/Content/Images/Image.jpg' border='0'>                    

Ответы [ 2 ]

9 голосов
/ 12 апреля 2011

У меня была такая же проблема.Я использую MVC 3. После того, как я выдернул свои волосы, я обнаружил, что после того, как вы используете Session State в своем веб-приложении, динамическая загрузка изображений, похоже, засоряется из-за запросов стучащего сеанса.Чтобы это исправить, я украсил свой контроллер следующим образом:

[SessionState (System.Web.SessionState.SessionStateBehavior.Disabled)] * ​​1003 *

Это отключило состояние сеанса для моего контроллера Photos и вернула скорость,Если вы используете более раннюю версию MVC, вам нужно перепрыгнуть через некоторые обручи и создать фабрику контроллеров / контроллеров для этого.См. Как отключить состояние сеанса в ASP.NET MVC?

Надеюсь, это поможет!

1 голос
/ 12 августа 2010

Вы добавляете накладные расходы обработки, выставляя изображение через MVC. Когда вы напрямую ссылаетесь на изображение, оно автоматически обрабатывается IIS, а не конвейером MVC, поэтому вы пропускаете много накладных расходов.

Кроме того, загружая в байтовый массив, вы загружаете полное изображение с диска в память и затем выводите его, а не просто воспроизводите прямо с диска.

Вы можете получить чуть лучшую производительность с этим:

[OutputCache(Duration=60, VaryByParam="*")]
public FileResult File(string ID)
{   
    string pathToFile;
    // Figure out file path based on ID
    return File(pathToFile, "image/jpeg");
}

Но это будет не так быстро, как пропуск MVC для статических файлов.

Если вышеприведенное исправит это для вас, вы, вероятно, захотите возиться с параметрами кэширования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...