2010-02-15 52 views
8

我正在建立一个网站,我需要一个页面,用户可以上传大型视频文件,我已创建WCF服务与流,但我从Button_Click事件的网页调用该WCF服务。从ASP.Net应用程序上传大文件

我已经使用下文提到的文章WCF服务创建

WCF Streaming

我已经使用流媒体,因为它应该是有效的,不应该在服务器的内存缓冲。

现在质疑

1)我有怀疑,整个文件被上传到Web服务器,然后将其转移到WCF服务的服务器......如果这是真的,那么我没有得到好处的流以及IIS和Web服务器将停机,如果用户上传大文件或多个用户很快被上传文件精读目前

2)是否有任何其他有效的方式做同样的操作与其他一些技术

请帮我...

编辑:

如果我不从ASP.NET的代码中调用WCF服务方法,在这种情况下也被传输的字节到我所用的是HttpFox检查Web服务器

我上面的事情已经检查与上传控制并将一个按钮放在UI的单击事件绑定到代码后面的一个方法上。

所以,还是我有这种混淆的是如何将数据传送

  1. 客户机 - Web服务器(ASP NET应用程序) - 服务服务器(WCF服务)
  2. 客户机 - 服务器服务( WCF服务)

注:如果我在button_click上放置一个调试点并上传10 kb文件,它会在少于1秒内击中该点。但如果我上传50 MB文件,那么它需要时间。

我放在调用该button_click事件

+0

我觉得冠军应该是“上传大文件*到* ASP.NET应用程序“。 – Constantin 2010-12-12 23:12:56

回答

5

1)我有怀疑,认为整个 文件被上传到网络服务器和 然后它被转移到WCF服务 服务器...如果这是真的话,我不 得到好处流以及 的IIS和Web服务器会如果用户上传大文件 或多个用户上传文件 骗子很快就会下来 目前

没有,你在这里混淆的东西。当您使用WCF流式传输上传大文件时,文件将以块的形式发送 - 大小为几个千字节的块。 WCF服务器 - 在IIS中运行或在NT服务或控制台应用程序中自行托管 - 接收这些块并在到达时将它们写入磁盘。

你不“上传整个文件到网络服务器”,然后“将其传送”到WCF服务 - WCF服务本身是接收和处理文件 - 只有一次。

如果托管WCF服务自己 - 在一个控制台应用程序,WinForms应用程序或Windows NT服务 - 还有的甚至没有在所有涉及任何IIS或Web服务器。 WCF自己处理它。

使用WCF流可能是最有效的记忆之一的大文件传输到服务器的最简单的方法之一。

退房的话题更多一些例子和博客文章:

+0

你好mark_s我也有同样的想法,但你能解释我的场景,我已经解释了我的编辑在哪里我没有调用任何WCF服务仍然是整个文件正在转移,这就是我感觉数据首先传输的原因到网络服务器(ASP .Net应用服务器) – Radhi 2010-02-16 12:29:05

+0

@Radhi:我不明白你到底想要做什么......尝试把你的WCF服务代码放到一个程序集中,主机 - 一个简单的控制台应用程序会做。那么你绝对完全独立于任何Web服务器/ IIS或任何东西。那样有用吗? – 2010-02-16 12:56:07

+0

实际上它是一个上传视频的网站,用户可以在两者之间共享它们,所以我希望该用户可以访问视频上传页面并能够从该页面上传它。那么,是不是可以承载WCF服务的控制台应用程序,并从客户调用它(因为我没有客户端机器上的任何控制) 是有可能从jQuery的调用WCF服务上传的文件? 请指导我... – Radhi 2010-02-16 14:30:54

2

这里是您最佳的解决方案内WCF服务的代码,我去你同样的路线,并得出结论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(); 

      } 

    } 

} 
相关问题