2010-02-15 27 views
8

Estoy construyendo un sitio web donde necesito una página donde el usuario puede cargar archivos de video grandes, he creado servicio WCF con transmisión pero estoy llamando a ese servicio WCF desde el evento Button_Click de la página web.Cargar archivos grandes desde la aplicación ASP .NET

he utilizado a continuación el artículo mencionado para la creación de servicios WCF

WCF Streaming

He utilizado el streaming, ya que debe ser eficaz y no debe ser amortiguada en la memoria del servidor.

Ahora cuestiona

1) Tengo dudas de que todo el archivo se carga en el servidor web y luego se transfiere al servidor del Servicio WCF ... si esto es cierto, entonces no estoy recibiendo las ventajas del streaming así como IIS y el servidor web estarán abajo muy pronto si el usuario la carga de archivos de gran tamaño o de varios usuarios están cargando archivos Côn Actualmente

2) ¿hay alguna otra manera eficiente de hacerlo misma operación con alguna otra técnica

favor ayúdame ...

EDIT:

Si yo no estoy llamando método de servicio WCF de código ASP .Net en ese caso también se está transfiriendo bytes al servidor web que he comprobado con HttpFox

He comprobado anteriormente cosa con carga controlar y poner un botón en la interfaz de usuario cuyo evento click está vinculado a un método en el código subyacente.

Por lo tanto, todavía estoy teniendo esa confusión que cómo se transfieren los datos

  1. máquina cliente - servidor Web (ASP .Net Aplicación) - Server Service (Servicio WCF) Máquina
  2. Client - Server Service (WCF Service)

NOTA: si pongo un punto de depuración en el botón_click y subiendo un archivo de 10 kb, lo golpeo en menos de 1 segundo. pero si estoy cargando un archivo de 50 mb, está tomando tiempo.

coloqué código de llamar al servicio WCF dentro de ese evento Button_Click

+0

Creo que el título debería ser "Subir archivos grandes * a * Aplicación ASP.NET ". – Constantin

Respuesta

5

1) Estoy teniendo dudas de que todo el archivo se carga en el servidor web y luego se transfiere al servidor WCF Service ...Si esto es cierto, entonces yo no estoy recibiendo las ventajas del streaming, así como IIS y el servidor web va a estar abajo muy pronto si usuario carga archivos de gran tamaño o varios usuarios están cargando archivos con Actualmente

No, estás confundiendo cosas aquí. Cuando utiliza la transmisión WCF para cargar un archivo grande, el archivo se envía en fragmentos, en bloques de varios Kbytes de tamaño. El servidor WCF, que se ejecuta en IIS o que se aloja automáticamente en un servicio NT o una aplicación de consola, recibe esos fragmentos y los escribe en el disco a medida que llegan.

No "carga todo el archivo en el servidor web" y luego "lo transfiere" al servicio WCF, el servicio WCF está recibiendo y manejando el archivo, y solo una vez.

Si aloja su servicio WCF usted mismo, en una aplicación de consola, una aplicación Winforms o un servicio Windows NT, no hay ningún servidor IIS o web involucrado. WCF maneja todo por sí mismo.

El uso de la transmisión WCF es probablemente una de las formas más sencillas de transferir grandes archivos a un servidor.

Si te preguntas por ejemplo más y entradas de blog sobre el tema:

+0

Hola mark_s, también estoy teniendo la misma idea, pero ¿pueden explicarme el escenario que tengo explicado en mi edición donde no estoy llamando a ningún servicio de WCF? Todavía se está transfiriendo un archivo completo, esa es la razón por la que siento que los datos se transfieren primero al servidor web (ASP .Net App Server) – Radhi

+0

@Radhi: No entiendo exactamente lo que está tratando de hacer ...... intente poner su código de servicio WCF en un ensamble, y escriba su propio auto- host: una aplicación de consola simple funcionará. Entonces eres totalmente independiente de cualquier servidor web/IIS o cualquier cosa. ¿Eso funciona? –

+0

En realidad, es un sitio web para cargar los videos y el usuario puede compartirlos en el medio, por lo que quiero que el usuario pueda visitar la página de carga de video y poder subirlo desde esa página. Entonces, ¿es posible alojar el servicio wcf en la aplicación de consola y llamarlo desde el cliente (ya que no tengo ningún control en la máquina cliente) ¿es posible llamar al servicio WCF desde jquery para cargar el archivo? Por favor, guíame ... – Radhi

2

Aquí es la mejor solución, fui la misma ruta que usted y la conclusión de ftp es más fácil y funciona a la perfección. Aquí es un código de ejemplo:

En primer lugar obtener esta biblioteca, funciona a la perfección:

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(); 

      } 

    } 

} 
Cuestiones relacionadas