从ASP .Net应用程序上传大文件

时间:2010-02-15 17:31:57

标签: asp.net wcf file-upload

我正在构建一个网站,我需要一个用户可以上传大型视频文件的页面,我已经创建了带流媒体的WCF服务,但我从网页的Button_Click事件中调用了WCF服务。

我使用了下面提到的文章来创建WCF服务

WCF Streaming

我使用了流媒体,因为它应该是高效的,不应该缓存在服务器的内存中。

现在问题

1)我怀疑整个文件是否上传到Web服务器然后它被转移到WCF服务服务器...如果这是真的那么我没有得到流媒体以及iis和web服务器的优势如果用户上传大文件或多个用户正在上传文件,那么很快就会失败

2)是否有其他有效的方法与其他技术进行相同的操作

请帮帮我......

编辑:

如果我没有在ASP .Net代码中调用WCF服务方法,那么它也会将字节传输到我用HTTPFox检查过的Web服务器

我已经通过上传控件检查了上面的内容,并在UI上放了一个按钮,其中click事件绑定到后面的代码中的一个方法。

所以,我仍然对数据的传输方式感到困惑

  1. 客户端计算机 - Web服务器(ASP .Net应用程序) - 服务服务器(WCF服务)
  2. 客户端计算机 - 服务服务器(WCF服务)
  3. 注意:如果我在button_click上放一个调试点并上传10 kb文件,它会在不到1秒的时间内完成。但如果我上传50 MB的文件,那就需要时间。

    我在该button_click事件中放置了调用WCF服务的代码

2 个答案:

答案 0 :(得分:5)

  

1)我怀疑整个   文件上传到Web服务器和   然后它被转移到WCF服务   服务器...如果这是真的那么我不是   获得流媒体的优势   因为iis和Web服务器将关闭   很快,如果用户上传大文件   或多个用户正在上传文件   目前

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

您没有“将整个文件上传到Web服务器”,然后将其“传输”到WCF服务--WCF服务本身正在接收和处理文件 - 并且只有一次。

如果您自己托管WCF服务 - 在控制台应用程序,Winforms应用程序或Windows NT服务中 - 甚至没有任何IIS或Web服务器参与AT ALL。 WCF自己处理它。

使用WCF流可能是内存效率最高的一种,也是将大型文件传输到服务器的最简单方法之一。

查看有关该主题的更多示例和博客文章:

答案 1 :(得分:2)

这是您最好的解决方案,我和您一样走路,并得出结论,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();

            }

    }

}