2013-02-12 3 views
2

Я хочу отправить изображения, хранящиеся в MongoDB, используя GridFS через веб-приложение MVC4 в браузер через среду локальной сети, но требуется ~ 500 мс, пока изображение не будет отправлено в браузер.Почему передача файлов из GridFS через MVC4 занимает так много времени?

Сетевой инспектор Google Chrome говорит, что большая часть времени проводится во время «Ожидания», а фактическое «получение» занимает ~ 1 мс.

Сервер MongoDB находится в локальной сети, так что может занять так много времени, чтобы отправить изображение 10 КБ? Я использую Windows 8 с Visual Studio 2012 и официальный mongo-csharp-драйвер через NuGet.

Вот мой код моего контроллера «Files», который принимает идентификатор объекта и передает данные для этого ID:

public FileContentResult Files(string id) 
{ 
    var database = new MongoClient(MyConnection).GetServer().GetDatabase("MyDB"); 
    var gridFs = new MongoGridFS(database); 
    var bsonId = new BsonObjectId(id); 
    var gridInfo = gridFs.FindOneById(bsonId); 
    var bytes = GridInfoToArray(gridInfo); 
    return new FileContentResult(bytes, "image/jpeg") { FileDownloadName = gridInfo.Name }; 
} 

private byte[] GridInfoToArray(MongoGridFSFileInfo file) 
{ 
    using (var stream = file.OpenRead()) 
    { 
     var bytes = new byte[stream.Length]; 
     stream.Read(bytes, 0, (int)stream.Length); 
     return bytes; 
    } 
} 

кодекса, чтобы отобразить изображение в представлении:

<img src="@Url.Action("Files", new { id = objectIdOfMyImage) })"/> 
+0

Сколько записей в вашей коллекции? Кроме того, вы пытались запустить 'объяснение' на оболочке? Возможно, вам не хватает указателя или чего-то еще. –

+0

В настоящее время существует только ~ 10 записей для тестирования – NKnusperer

+0

Как насчет запуска 'объяснения' по вашему запросу? Или проверить задержку между вашим веб-сервером и вашим сервером mongodb? –

ответ

0

Насколько отличаются результаты, если вы кэшируете экземпляры базы данных и MongoGridFS?

// create static fields for _database & _gridFs 
var database = _database ?? 
    (_database = new MongoClient(MyConnection).GetServer().GetDatabase("MyDB")); 
var gridFs = _gridFs ?? 
    (_gridFs = new MongoGridFS(database)); 

Я не знаю, как много накладных расходов, которые он несет, когда экземпляр этого, но это не мешало бы перенести его за пределы метода, который вы пытаетесь оптимизировать.