Загрузить большие файлы из приложения ASP .Net - PullRequest
8 голосов
/ 15 февраля 2010

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

Я использовал нижеприведенную статью для создания сервиса WCF

WCF Streaming

Я использовал потоковую передачу, так как она должна быть эффективной и не должна буферизироваться в памяти сервера.

Теперь вопросы

1) У меня есть сомнения, что весь файл загружается на веб-сервер, а затем передается на сервер службы WCF ... если это так, то я не получаю преимущества потоковой передачи, а также iis и веб-сервера очень скоро будет недоступен, если пользователь загружает большой файл или несколько пользователей загружают файлы в настоящее время

2) Есть ли другой эффективный способ сделать ту же операцию с другой техникой

Пожалуйста, помогите мне ...

РЕДАКТИРОВАТЬ:

Если я не вызываю метод службы WCF из кода ASP .Net, в этом случае он также передает байты на веб-сервер, который я проверил с помощью HTTPFox

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

Итак, у меня все еще возникает путаница, что как данные передаются

  1. Клиентский компьютер - веб-сервер (приложение ASP .Net) - служебный сервер (служба WCF)
  2. Клиентский компьютер - Сервисный сервер (служба WCF)

ПРИМЕЧАНИЕ. Если я помещаю точку отладки на button_click и загружаю файл размером 10 Кбайт, он достигает этого менее чем за 1 секунду. но если я загружаю файл размером 50 МБ, тогда это занимает время.

Я поместил код вызова службы WCF в это событие button_click

Ответы [ 2 ]

5 голосов
/ 16 февраля 2010

1) У меня есть сомнения, что весь файл загружается на веб-сервер и затем он передается в службу WCF сервер ... если это правда, то я не получить преимущество потоковой передачи, а также как иис и веб-сервер будет недоступен очень скоро, если пользователь загрузит большой файл или несколько пользователей загружают файлы против в настоящее время

Нет, вы тут все путаете. Когда вы используете потоковую передачу WCF для загрузки большого файла, файл отправляется кусками - размером несколько килобайт. Сервер WCF - работает в IIS или размещается в службе NT или в консольном приложении - при получении этих блоков и их записи на диск по мере их поступления.

Вы не «загружаете весь файл на веб-сервер», а затем «переносите его» в службу WCF - сама служба WCF получает и обрабатывает файл - и только один раз.

Если вы размещаете свою службу WCF самостоятельно - в консольном приложении, приложении Winforms или службе Windows NT - ВСЕГО даже не будет задействован IIS или веб-сервер. WCF справляется со всем этим самостоятельно.

Использование потоковой передачи WCF, вероятно, является одним из наиболее эффективных способов использования памяти и одним из самых простых способов передачи больших файлов на сервер.

Посмотрите еще несколько примеров и постов в блоге на эту тему:

2 голосов
/ 15 февраля 2010

Вот ваше лучшее решение, я пошел тем же путем, что и вы, и пришел к выводу, что ftp проще и работает без нареканий. Вот пример кода:

Сначала получите эту библиотеку, работает без нареканий:

http://www.freedownloadscenter.com/Programming/Components_and_Libraries/BytesRoad_NetSuit_Library.html

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.IO;
    using System.Configuration;
    using System.Collections.Specialized;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Net;
    using BytesRoad.Net.Ftp;





    namespace GetMedia
    {
        class Program
        {

            static void Main(string[] args)
            {

                string strPath;
                string strThumbPath;
                string strThumbLocalPath;
                string strURLRoot;
                string strVideoFile;
                string strThumbfile;
                string strError;


                BizetDataDataContext db = new BizetDataDataContext();
                VCMediaDataContext db2 = new VCMediaDataContext();
                db.Connection.ConnectionString = Settings.Default.ConnectionString;
                db2.Connection.ConnectionString = Settings.Default.ConnectionString;

                //Temp Folder
                strPath = Settings.Default.TempFolder;
                strThumbLocalPath = Settings.Default.ThumbPath;

download video and thumb
            //then upload to mediaserver

                IQueryable<BizetInfo> custQuery =
                from bizet in db.BizetInfos
                where bizet.Path != null
                select bizet;

                foreach (BizetInfo objbizet in custQuery)
                {
                    //Grab filename and path


                    strVideoFile = Path.GetFileName(objbizet.Path).Replace("%20", "_").Replace("_medium", "").Replace(" ", "_");
                    strThumbfile = Path.GetFileName(objbizet.Path).Replace("%20", " ").Replace("_medium.wmv", ".mpg.png");
                    strURLRoot = objbizet.Path.Replace(Path.GetFileName(objbizet.Path), "");
                    strThumbPath = strURLRoot + strThumbfile;



                    strError = "";

                    try
                    {



                        wsViaCastMedia.MediaTransferSoapClient ws = new wsViaCastMedia.MediaTransferSoapClient();

                        System.Net.WebClient wc = new System.Net.WebClient();
                        //connect to Bizet
                        Console.WriteLine("Starting spotID: " + objbizet.SPOTID.ToString().Trim());
                        Console.WriteLine("connected to ws");
                        Console.WriteLine("Downloading Video File");

                        //Download  Video
                        wc.DownloadFile(objbizet.Path, strPath + strVideoFile);

                        //Download Thumb
                        Console.WriteLine("Downloading Thumb File");

                        wc.DownloadFile(strThumbPath, strThumbLocalPath + strThumbfile);

                        wc.Dispose();

                        //new ftp code

                        BytesRoad.Net.Ftp.FtpClient f = new BytesRoad.Net.Ftp.FtpClient();
                        f.PassiveMode = false;

                        f.Connect(999999999, "IPADDRESS OF FTP", 21);
                        f.Login(999999999, "", "");

                        try
                        {
                            f.ChangeDirectory(999999999, objbizet.CLIENTID.ToString().Trim());
                        }
                        catch (Exception e)
                        {
                            f.CreateDirectory(999999999, objbizet.CLIENTID.ToString().Trim());
                            f.ChangeDirectory(999999999, objbizet.CLIENTID.ToString().Trim());
                            Console.WriteLine(e);
                        }

                        f.PutFile(999999999, strVideoFile, "E:\\temp\\" + strVideoFile);



                        Console.WriteLine("Transfer of Video File " + objbizet.Path + " Complete");
                        //response.Close();
                        f.Disconnect(999999999);

                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        strError = e.ToString();
                    }
                    finally //Update Data
                    {
                        //check if spot Exists ///need to fix

                        //var myquery = from m in db2.Medias
                        //              where m.SpotID == Convert.ToInt32(objbizet.SPOTID.Trim())
                        //              select m;
                        //foreach (var mm in myquery)
                        //{
                        //    //db2.DeleteMedia(objbizet.SPOTID.Trim());
                        //}

                        if (strError == "")
                        {
                            db2.AddMedia(Convert.ToInt32(objbizet.SPOTID), objbizet.Title, objbizet.Keywords, objbizet.Path, strVideoFile, objbizet.CLIENTNAME, Convert.ToInt32(objbizet.CLIENTID), objbizet.SUBCATEGORYNAME, Convert.ToInt32(objbizet.SUBCATEGORYID), Convert.ToDecimal(objbizet.PRICE), strThumbfile, objbizet.Description);
                        }
                        else
                        {
                            db2.AddMedia(Convert.ToInt32(objbizet.SPOTID), "Under Maintenance -  " + objbizet.Title, objbizet.Keywords, objbizet.Path, strVideoFile, objbizet.CLIENTNAME, Convert.ToInt32(objbizet.CLIENTID), objbizet.SUBCATEGORYNAME, Convert.ToInt32(objbizet.SUBCATEGORYID), Convert.ToDecimal(objbizet.PRICE), strThumbfile, objbizet.Description);
                        }
                    }




                }
                //dispose
                db.Dispose();
                db2.Dispose();

            }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...