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