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

Мне нужно предоставить функцию загрузки файлов, где веб-сервер извлекает файл из другого источника (через 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. help в методе HttpWebResponse.GetResponseStream говорит: «Вы должны вызвать либо метод Stream.Close, либо HttpWebResponse.Close, чтобы закрыть поток и освободить соединение для повторного использования. Нет необходимости вызывать оба Stream .Close и HttpWebResponse.Close, но это не приводит к ошибке. Невозможность закрыть поток приведет к тому, что в вашем приложении не будет соединений. "

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

1 Ответ

0 голосов
/ 19 января 2012

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

...