[C#.NET][TCP Socket] 使用 HttpWebRequest 與 HttpWebResponse 類別取得伺服器串流
續上篇 [NetWork] 使用 HttpWebRequest 與 HttpWebResponse 類別取得伺服器資訊,本篇則是實作GetResponseStream(),用來取得網頁資料。
![]()
程式碼的流程都相同。
實作範例碼如下:
private void button1_Click(object sender, EventArgs e)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text);
request.Method = WebRequestMethods.Http.Get;
HttpWebResponse response = null;
Stream stream = null;
StreamReader streamReader = null;
try
{
response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode==HttpStatusCode.OK)
{
stream = response.GetResponseStream();
streamReader = new StreamReader(stream);
char[] buffer = new char[256];
int data = 0;
string result = "";
//分批讀
while (true)
{
data = streamReader.Read(buffer, 0, buffer.Length);
string msg = new string(buffer, 0, data);
result = result + msg;
if (data == 0)
break;
}
txtResponse.Text = result;
}
}
catch (WebException ex1)
{
HttpWebResponse exResponse = (HttpWebResponse)ex1.Response;
MessageBox.Show(ex1.Message);
}
catch (NotSupportedException ex2)
{
MessageBox.Show(ex2.Message);
}
catch (ProtocolViolationException ex3)
{
MessageBox.Show(ex3.Message);
}
catch (InvalidOperationException ex4)
{
MessageBox.Show(ex4.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
if (response != null) response.Close();
if (streamReader != null) streamReader.Close();
if (stream != null) stream.Close();
}
}
接下來採用非同步方法來處理
private void button2_Click(object sender, EventArgs e)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text);
request.Method = WebRequestMethods.Http.Get;
request.BeginGetResponse(new AsyncCallback(responseCallback), request);
}
void responseCallback(IAsyncResult Result)
{
HttpWebRequest request = Result.AsyncState as HttpWebRequest;
HttpWebResponse response = request.EndGetResponse(Result) as HttpWebResponse;//取得串流資料
if (response.StatusCode == HttpStatusCode.OK)
{
Stream stream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(stream);
char[] buffer = new char[256];
int data = 0;
string result = "";
//分批讀
while (true)
{
data = streamReader.Read(buffer, 0, buffer.Length);
string msg = new string(buffer, 0, data);
result = result + msg;
if (data == 0)
break;
}
this.BeginInvoke(new updateControl(UpdateControl), new object[] { txtResponse, result });
//txtResponse.Text = result;
}
}
delegate void updateControl(Control Ctrl, string Msg);
void UpdateControl(Control Ctrl, string Msg)
{
((TextBox)Ctrl).Text = Msg;
}
執行結果仍與上圖相同,這次就懶的抓例外。
每一個網站類型都不太一樣,若是不同的網站,程式碼分析的流程也會有所不同,所以若遇到錯誤,就得多花點精神除錯了。
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET