Это определенно не правильно. Не имея всего кода, было бы очень трудно сказать, в чем проблема.
Прежде всего, я действительно сомневаюсь, что такая большая разница может быть вызвана только кэшированием, но имеет смысл иметь кэширование вывода в вашем действии. Обработчик статического содержимого действительно использует кэширование вывода, так что в этом частично можно винить.
Если это не решит проблему, я предлагаю поместить трассировка в различные аспекты вызова, от создания контроллера (возможно, в конструкторе, если вы не используете фабрику пользовательских контроллеров) до действия до загрузки файл, после загрузки файла и EndRequest. Вы можете использовать Debug.WriteLine, а затем использовать DebugView, чтобы узнать, сколько времени занял каждый раздел, и это должно помочь вам найти узкое место.