[C#.NET][TCP Socket] 使用 HttpWebRequest 與 HttpWebResponse 類別取得伺服器串流

  • 13647
  • 0
  • 2013-08-16

[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();
    }
}

image

 


 

接下來採用非同步方法來處理

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;
}

 

執行結果仍與上圖相同,這次就懶的抓例外。

 


後記:HttpWebResponseStream.zip

每一個網站類型都不太一樣,若是不同的網站,程式碼分析的流程也會有所不同,所以若遇到錯誤,就得多花點精神除錯了。

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo