Deepak Tiwari (D'pak) Ответов: 2

Как я могу быстро загрузить файл в MVC с помощью C#


Я реализовал один из них asp.net сайт MVC, где пользователи могут скачивать большие MP3-файлы (до 120 МБ) и прекрасно работает. Но проблема в том, что когда мы отправляем запрос на загрузку файла, то загрузка начинается правильно, но мы не можем выполнить никаких действий на сайте до тех пор, пока файл полностью не загрузится (не получая никакого ответа на любой другой запрос). Как я могу сделать быструю загрузку файла и другой запрос также отправить ответ вместе с загрузкой файлов? Мои файлы хранятся в большом двоичном объекте хранилища Microsoft Azure.

Что я уже пробовал:

public async Task<string> DownloadMediaFile(string url)
        {
            int lstidx = url.LastIndexOf('/');
            int charslngth = url.Length - 1;
            string getFileNameWithExtension = url.Substring(lstidx + 1, charslngth - lstidx);           
            string fileName = getFileNameWithExtension;
            //Create a stream for the file
            Stream stream = null;

            //This controls how many bytes to read at a time and send to the client
            int bytesToRead = 10000;

            // Buffer to read bytes in chunk size specified above
            byte[] buffer = new Byte[bytesToRead];

            // The number of bytes read
            try
            {
                //Create a WebRequest to get the file
                HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create(url);

                //Create a response for this request
                HttpWebResponse fileResp = (HttpWebResponse)fileReq.GetResponse();

                if (fileReq.ContentLength > 0)
                    fileResp.ContentLength = fileReq.ContentLength;

                //Get the Stream returned from the response
                stream = fileResp.GetResponseStream();

                // prepare the response to the client. resp is the client Response
                var resp = Response;

                //Indicate the type of data being sent
                resp.ContentType = "application/octet-stream";

                //Name the file 
                resp.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
                resp.AddHeader("Content-Length", fileResp.ContentLength.ToString());

                int length;
                do
                {
                    // Verify that the client is connected.
                    if (resp.IsClientConnected)
                    {
                        // Read data into the buffer.
                        length = stream.Read(buffer, 0, bytesToRead);

                        // and write it out to the response's output stream
                        resp.OutputStream.Write(buffer, 0, length);

                        // Flush the data
                        resp.Flush();

                        //Clear the buffer
                        buffer = new Byte[bytesToRead];
                    }
                    else
                    {
                        // cancel the download if client has disconnected
                        length = -1;
                    }
                } while (length > 0); //Repeat until no data is read
            }
            finally
            {                
                if (stream != null)
                {
                    //Close the input stream
                    stream.Close();
                }
            }
            return "success";
        }

2 Ответов

Рейтинг:
2

RmcbainTheThird

Сделайте свою загрузку в отдельном потоке


Рейтинг:
15

Richard Deeming

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

Поскольку вы, похоже, не используете состояние сеанса или TempData в своем действии вы можете отключить его. К сожалению, вам нужно сделать это на уровне контроллера, поэтому вам нужно будет переместить свой DownloadMediaFile действие на другой контроллер. Затем добавьте SessionState атрибут к этому контроллеру:

[SessionState(SessionStateBehavior.Disabled)]
public class DownloadController : Controller
{
    ...


Deepak Tiwari (D'pak)

Спасибо, все работает нормально.

Deepak Tiwari (D'pak)

Как я могу улучшить свой код для быстрой загрузки?