Загрузка больших файлов из ASP.Net применение
Я создаю веб-сайт, где мне нужна страница, где пользователь может загружать большие видеофайлы, я создал службу WCF с потоковой передачей, но я вызываю эту службу WCF из события Button_Click веб-страницы.
Я использовал ниже упомянутую статью для создания службы WCF
Я использовал течь как она должна быть эффективной и не должна быть буферизировано в памяти сервера.
теперь вопросы
1) У меня возникают сомнения, что весь файл загружается на веб-сервер, а затем передается на сервер службы WCF...если это правда то я не получаю преимущество потоковой передачи, а также IIS и веб-сервер будет очень скоро, если пользователь загружает большой файл или несколько пользователей загружают файлы кон
2) есть ли другой эффективный способ сделать ту же операцию с какой-либо другой метод
пожалуйста, помогите мне ...
EDIT:
Если я не вызывая метод службы WCF из кода ASP .Net, в этом случае он также передает байты на веб-сервер, который я проверил с помощью HTTPFox
Я проверил выше вещь с контролем загрузки и помещением одной кнопки на UI, событие click которого связано с одним методом в коде позади.
Итак, все еще у меня есть эта путаница, что, как данные передаются
- клиентская машина-веб-сервер (ASP .Net Application) - сервер службы (WCF Сервис)
- сервер клиентской машины-службы (Служба WCF)
Примечание: Если я ставлю точку отладки на button_click и загружаю файл 10 kb, он попадает в это менее чем за 1 сек. но если я загружаю файл 50 mb, то это занимает время.
Я поместил код вызова службы WCF внутри этого события button_click
2 ответов
1) у меня есть сомнения, что весь файл загружается на веб-сервер и затем он передается в Службу WCF сервер...если это правда, то я не получение преимущества потоковой передачи, а также поскольку iis и веб-сервер будут отключены очень скоро, если пользователь загружает большой файл или несколько пользователей загружают файлы con в настоящее время
нет, вы путаете вещи здесь. Когда вы используете потоковую передачу WCF для загрузки большого файла, файл отправляется кусками - в блоках размером несколько Кбайт. Сервер WCF, работающий в IIS или самостоятельно размещенный в службе NT или консольном приложении, получает эти фрагменты и записывает их на диск по мере их поступления.
вы не "загружаете весь файл на веб-сервер", а затем" передаете его " службе WCF - сама служба WCF получает и обрабатывает файл - и только один раз.
Если вы размещаете свою службу WCF самостоятельно-в консольном приложении, приложении Winforms или службе Windows NT - есть даже ни один IIS или веб-сервер не участвует вообще. WCF обрабатывает все это самостоятельно.
использование потоковой передачи WCF, вероятно, является одним из наиболее эффективных и простых способов передачи больших файлов на сервер.
проверьте еще несколько примеров и сообщений в блоге по теме:
вот ваше лучшее решение, я пошел по тому же маршруту, что и вы, и пришел к выводу, что ftp проще и работает безупречно. Вот пример кода:
сначала получите эту библиотеку, работает безупречно:
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();
}
}
}