ASP.NET MVC 3 обеспечивает загрузку больших файлов в браузер, в то время как сервер извлекает файл из другого места.

Мне нужно предоставить функцию загрузки файлов, при которой веб-сервер извлекает файл из другого источника (через HTTP) и одновременно передает его в браузер. Я предполагаю, что использование MVC Controller.File ActionResult не сработает, но я все равно написал такой прототип:

public ActionResult Download()
{
    HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create("http://somewhere/somefile.pdf");
    HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
    Stream stream = webResponse.GetResponseStream();
    var mimeType = "application/pdf";
    var fileName = "somefile.pdf";
    return File(stream, mimeType, fileName);
}

Это работает нормально, но нет возможности вызвать Close () для HttpWebResponse и Stream после оператора return. справка по методу HttpWebResponse.GetResponseStream говорит: «Вы должны вызвать метод Stream.Close или HttpWebResponse.Close, чтобы закрыть поток и освободить соединение для повторного использования. Нет необходимости вызывать одновременно Stream.Close и HttpWebResponse.Close, но это не вызывает ошибка. Неспособность закрыть поток приведет к тому, что у вашего приложения закончатся соединения. "

Должен ли я создать HttpHandler и вручную прочитать байты из исходного потока и записать их в ответ в соответствии со строками this или это? Есть ли другой подход, о котором я не знаю?


person ricb    schedule 28.10.2011    source источник
comment
Согласно этому вопросу, фреймворк закроет стрим для вас в этом случае.   -  person Matthew Flaschen    schedule 29.10.2011


Ответы (1)


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

person Nate Kindrew    schedule 19.01.2012