Jaa


Чтение 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.aspx

  • Anonymous
    April 09, 2008
    Мне нравится пост. Он годный. Но при этом не пройтись теми самыми сапогами по предмету поста не могу...

  • Anonymous
    July 03, 2008
    Эльдар, бета2 вышла, так что пора подправить :) А вообще у меня вопрос - как обеспечить авторизацию, когда обращаешься к защишенным страницам и сервисам. Никаких свойств для задания Имени и Пароля ни WebClient ни в классах System.ServiceModel.ClientBase не найдено. Есть ли у Вас какая-то информация относительно этого?