Чтение HTTP в .Net и Silverlight
??-?, ??? ???????????? ?????? ??????????? ????. ??-??, ????, ??????????. ?? ???????? - ?? ?????. ??????, ????-?? ??????, ?? ???? ??? ???? ?? ??? ?? ?????, ????? ??????? ??????? ???-?? ???????, ? ?? ????????? ? ???????????. ???, ????-?? ??????, ???? ??? ???? ??? ?? ????? ????. ??????, ??? ?????? ????? ???? ???. ? ?????, ?? ????????????, ???? ???????????, ?? ????????. ???? ?????? ??? ????? ??????? ????????????, ?????? ???, ????? ?????? ?????????? ?????? ???????...
????, ??? HTTP ? .Net ? Silverlight ???? ??? ??????? ??????, ??????? ?????? ???????? ???? ? ?? ??: HttpWebRequest ? WebClient. ?????? ???? ?????????? ??? ???????????? ?? ??? (???? ?????? ????????????? ???????).
????, ??????? ???????? ?????????, ??????? ?? ????? ?????????:
using System;
namespace
HttpCalls
{
class Program
{
static void Main(string[] args)
{
HttpWebRequestBased r1 = new HttpWebRequestBased();
r1.Get("https://blogs.technet.com/eldar/default.aspx");
Console.ReadLine();
WebClientBased r2 = new WebClientBased();
r2.Get("https://blogs.technet.com/eldar/default.aspx");
Console.ReadLine();
HttpRequestBasedSync r3 = new HttpRequestBasedSync();
r3.Get("https://blogs.technet.com/eldar/default.aspx");
Console.ReadLine();
}
}
}
?????? ?????? ? ?????????? - ??????????? ????????????? HttpWebRequest:
using
System;
using System.Net;
using System.IO;
namespace
HttpCalls
{
class HttpRequestBasedSync
{
public void Get(string URL)
{
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(URL);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string res = sr.ReadToEnd();
sr.Close();
Console.WriteLine("Success. Press any key to see the result:");
Console.ReadLine();
Console.WriteLine(res.Substring(0, 500));
}
}
}
?????????? ? ?? ??????... ??-?-?... ??, ?????, ? ?????? ?? ??????! ?? ??????? ???? ?????? ?????????. ??????, ? Silverlight ??? ???? ?? ?????????, ??? ??????????? GetResponseStream ????, ????? ?? ??????????? UI thread, ?? ??????? ? Silverlight ??????????? ????? ??? ??????????. ??? ??? ?? ??????? ? ?????? ?? ?? ????? ??????????:
using
System;
using System.Net;
using System.IO;
namespace
HttpCalls
{
class HttpWebRequestBased
{
public void Get(string URL)
{
req = (HttpWebRequest)HttpWebRequest.Create(URL);
req.BeginGetResponse(new AsyncCallback(callback), null);
}
private void callback(IAsyncResult ar)
{
if (ar.IsCompleted)
{
HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string res = sr.ReadToEnd();
sr.Close();
Console.WriteLine("Success. Result:");
//Console.ReadLine();
Console.WriteLine(res.Substring(0,500));
}
}
private HttpWebRequest req;
}
}
? ?????, callback ?????????? ?? ????? ???? ????? ???? ???, ??? ??? ?? ???????????? ???? ?? ??, ????? ?????????? ?????? progress bars ? ????????. ? Silverlight callback ?????????? ?? UI thread, ?? ????? ??, ??????, ??? ??? ????? ??????????, ??? ??? ?????? UI ???????? ? ???? ?????? ????? ????????. ???... ?? ?????? ??????.
?? ? ???????, ?? ?? ????? ?????????? ? WebClient. ???? ????? ?????????????? ????? "???????????" ? "???????", ??? ??? ?? ???????????, ??? ?? ??????? ?????? ????? ????.
using
System;
using System.Net;
using System.IO;
namespace HttpCalls
{
class WebClientBased
{
public void Get(string URL)
{
WebClient client = new WebClient();
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
client.OpenReadAsync(new Uri(URL));
}
void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Cancelled || e.Error != null)
{
Console.WriteLine("Error reading the file");
}
else
{
Stream stream = e.Result;
StreamReader sr = new StreamReader(stream);
string res = sr.ReadToEnd();
sr.Close();
Console.WriteLine("Success. Result:");
//Console.ReadLine();
Console.WriteLine(res.Substring(0, 500));
}
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
Console.WriteLine("Progress is {0}, {1}% out of {2} bytes.", e.BytesReceived, e.ProgressPercentage, e.TotalBytesToReceive);
}
}
}
?????????? callback ? Silverlight ???? ?? UI thread, ?? ??????? ???? ???? ???. ? Silverlight ? ??? ????? ????????? ????? client_DownloadProgressChanged ? ????????????? ??????????, ? ??????? .Net ? ????? ?? ?????. ???????, ???? ???? ????? ? ?????????, ?? ?????? ???????, ??????? ?????????, ??????? ? ???????? ?????? (Stream) ? ??? ??? ????? ??? ?? ??? ???, ???? ?????? Http ?????? ?? ??????????.
? Silverlight ?? ???? ???? ??????? Stream ??? ?? ???? wrapper ?????? ????? ??????, ??????????? ? native ????, ??? ??? ?????? Seek() ???????? ??? ????. ????? ??????.
????????, ??? ??? ??? ?? ????????? ?????????????? ?????????? ?? ?????? ??????. ????? ?????? ???? 2 Silverlight v.2, ? ????????? ????????????? ??????? ? ??????????? ? ?????? ??????????? ????????.
Comments
Anonymous
January 01, 2003
Mako: насчет дат проверьте сайт. Я к сожалению, понятия не имею какие даты называет маркетинг, а это их епархия. Но то, что Михаил назвал звучит вполне правдоподобно. Игорь: так же как и любые другие действия не на UI thread. Впрочем, я не говорю, что не будет, я лишь предупреждаю, чтобы поосторожнее с этим. Детально обсудим по выходу беты. Илья: мы тут чай на чистых салфеточках пьем, а ты приходишь в грязных сапогах, да еще и флеш свой на стол вываливаешь... Следующий раз читай хотя бы первую строчку поста, который критикуешь: "Не нравится - не ешьте."Anonymous
January 01, 2003
> Эльдар, бета2 вышла, так что пора подправить :) И правда... Поправка, собственно, небольшая: HttpWebRequest теперь может делать progressive download, когда вам дают Stream еще до того как загрузили все данные. В этом случае callback вызывается не на UI thread, причем к этому потоку даже и обращаться на UI thread нельзя по двум причинам: во-первых он blocking, то есть если попытаться прочитать десять байт, а они еще не пришли, Read будет ждать пока придут, что на UI thread, ясное дело, плохое. А во-вторых, если попробуете вам исключение бросят, чтобы и не пытались. Чтобы попасть в режим progressive download нужно AllowReadStreamBuffering на запросе поставить в false прежде чем вызывать BeginGetResponse. Вот собственно и все. А насчет имени-пароля... такое ощущение, что и правда нет под Silverlight. В .Net понятное дело Credentials для этого.Anonymous
January 01, 2003
Ну хоть флеш на стол не вываливайте на публику, корнет... Я и сам в этом плане не дурак, знаете ли, но в привате-с...Anonymous
January 01, 2003
А когда, кстати, намечается выход релиза SilverLight 2.0 и если есть информация по поводу количества загрузок плагина SilverLight, поделитесь please, есть желание засунуть его в проект, но нет статистики...Anonymous
January 01, 2003
Да, нашему DPE нужно верить :)Anonymous
April 07, 2008
Релиз Silverlight 2 будет до конца года, во втором квартале выйдет Beta2 с коммерческой лицензией Go-Live. По статистике, которая была озвучена на MIX08, каждый день происходит более 1.5 миллионов скачиваний Silverlight.Anonymous
April 07, 2008
Если callback будет вызываться в будущем не из UI thread и менять UI будет нельзя... То как вообще отобразить окончание загрузки?Anonymous
April 07, 2008
(прошу прощения за повтор, прошлый надо потереть) Этот пример сливает с треском по длине flashевскому actionscriptу из-за наличия в оном анонимных функций первого класса. Алсо: названия функций а-ля немецкий язык, прям-таки классический wtf http://thedailywtf.com/Comments/Really-Descriptive-Names.aspxAnonymous
April 09, 2008
Мне нравится пост. Он годный. Но при этом не пройтись теми самыми сапогами по предмету поста не могу...Anonymous
July 03, 2008
Эльдар, бета2 вышла, так что пора подправить :) А вообще у меня вопрос - как обеспечить авторизацию, когда обращаешься к защишенным страницам и сервисам. Никаких свойств для задания Имени и Пароля ни WebClient ни в классах System.ServiceModel.ClientBase не найдено. Есть ли у Вас какая-то информация относительно этого?