Share via


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