天天看點

穩紮穩打Silverlight(21) - 2.0通信之WebRequest和WebResponse, 對指定的URI送出請求以及接收響應

<a href="http://webabcd.blog.51cto.com/1787395/342790" target="_blank">[索引頁]</a>

<a href="http://down.51cto.com/data/100302" target="_blank">[源碼下載下傳]</a>

穩紮穩打Silverlight(21) - 2.0通信之WebRequest和WebResponse, 對指定的URI送出請求以及接收響應

介紹

Silverlight 2.0 詳解WebRequest和WebResponse,對指定的URI做GET和POST請求,以及接收其響應

    HttpWebRequest - 對指定的 URI 送出請求

        Create() - 初始化一個 WebRequest

        BeginGetResponse() - 開始對指定 URI 資源做異步請求

        EndGetResponse() - 結束對指定 URI 資源做異步請求

    HttpWebResponse - 對指定的 URI 做出響應

        GetResponseStream() - 擷取響應的資料流

線上DEMO

<a href="http://webabcd.blog.51cto.com/1787395/342779">http://webabcd.blog.51cto.com/1787395/342779</a>

示例

1、對指定的URI做GET請求以及接收響應

WebRequestGet.xaml

&lt;UserControl x:Class="Silverlight20.Communication.WebRequestGet" 

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&gt; 

        &lt;StackPanel HorizontalAlignment="Left" Margin="5"&gt; 

                &lt;TextBlock x:Name="lblMsg" /&gt; 

        &lt;/StackPanel&gt; 

&lt;/UserControl&gt;

WebRequestGet.xaml.cs

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Net; 

using System.Windows; 

using System.Windows.Controls; 

using System.Windows.Documents; 

using System.Windows.Input; 

using System.Windows.Media; 

using System.Windows.Media.Animation; 

using System.Windows.Shapes; 

using System.Threading; 

using System.IO; 

namespace Silverlight20.Communication 

        public partial class WebRequestGet : UserControl 

        { 

                // 接收 GET 方式資料的 REST 服務 

                string _url = "http://localhost:3036/REST.svc/Users/json"; 

                // 異常資訊 

                string _exception = ""; 

                // SynchronizationContext - 同步上下文管理類 

                SynchronizationContext _syncContext; 

                public WebRequestGet() 

                { 

                        InitializeComponent(); 

                        Demo(); 

                } 

                void Demo() 

                        // SynchronizationContext.Current - 目前線程的同步上下文 

                        _syncContext = SynchronizationContext.Current; 

                        /* 

                         * HttpWebRequest - 對指定的 URI 送出請求 

                         *         HttpWebRequest.Create(uri) - 初始化一個 WebRequest 

                         *         HttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state) - 開始對指定 URI 資源做異步請求 

                         *                 AsyncCallback callback - System.AsyncCallback 委托。異步操作完成時調用的回調方法 

                         *                 Object state - 包含此異步請求的對象。即相應的 HttpWebRequest 對象 

                         *         HttpWebRequest.Abort() - 取消該異步請求 

                         *         HttpWebRequest.Accept - HTTP 頭的 Accept    部分 

                         *         HttpWebRequest.ContentType - HTTP 頭的 ContentType 部分 

                         *         HttpWebRequest.Headers - HTTP 頭的 key/value 對集合 

                         *         HttpWebRequest.Method - HTTP 方法(隻支援GET和POST) 

                         *         HttpWebRequest.RequestUri - 所請求的 URI 

                         *         HttpWebRequest.HaveResponse - 是否接收到了指定 URI 的響應 

                         *         HttpWebRequest.AllowReadStreamBuffering - 是否對從 Internet 資源接收的資料做緩沖處理。預設值為true,将資料緩存在用戶端記憶體中,以便随時被應用程式讀取 

                         */ 

                        HttpWebRequest request = WebRequest.Create( 

                                new Uri(_url, UriKind.Absolute)) as HttpWebRequest; 

                        request.Method = "GET"; 

                        request.BeginGetResponse(new AsyncCallback(ResponseCallback), request); 

                private void ResponseCallback(IAsyncResult result) 

                        // IAsyncResult.AsyncState - AsyncCallback 傳過來的對象 

                        HttpWebRequest request = result.AsyncState as HttpWebRequest; 

                        WebResponse response = null; 

                        try 

                        { 

                                // HttpWebRequest.EndGetResponse(IAsyncResult) - 結束對指定 URI 資源做異步請求 

                                //         傳回值為 WebResponse 對象 

                                response = request.EndGetResponse(result) as HttpWebResponse; 

                        } 

                        catch (Exception ex) 

                                _exception = ex.ToString(); 

                        // SynchronizationContext.Post(SendOrPostCallback d, Object state) - 将異步消息發送到該同步上下文中 

                        //         SendOrPostCallback d - System.Threading.SendOrPostCallback 委托 

                        //         Object state - 需要傳遞的參數 

                        _syncContext.Post(GetResponse, response); 

                private void GetResponse(object state) 

                         * HttpWebResponse - 對指定的 URI 做出響應 

                         *         GetResponseStream() - 擷取響應的資料流 

                        HttpWebResponse response = state as HttpWebResponse; 

                        if (response != null) 

                                Stream responseStream = response.GetResponseStream(); 

                                using (StreamReader sr = new StreamReader(responseStream)) 

                                { 

                                        lblMsg.Text = sr.ReadToEnd(); 

                                } 

                        else 

                                lblMsg.Text = _exception; 

        } 

}

2、對指定的URI做POST請求以及接收響應

WebRequestPost.xaml

&lt;UserControl x:Class="Silverlight20.Communication.WebRequestPost" 

WebRequestPost.xaml.cs

        public partial class WebRequestPost : UserControl 

                // 接收 POST 方式資料的 REST 服務 

                string _url = "http://localhost:3036/REST.svc/PostUser"; 

                public WebRequestPost() 

                        request.Method = "POST"; 

                        // BeginGetRequestStream(AsyncCallback callback, Object state) - 向指定的 URI 資源發送資料的流的異步請求 

                        //         AsyncCallback callback - System.AsyncCallback 委托 

                        //         Object state - 包含此異步請求的對象。即相應的 HttpWebRequest 對象 

                        IAsyncResult asyncResult = request.BeginGetRequestStream( 

                                new AsyncCallback(RequestStreamCallback), request); 

                private void RequestStreamCallback(IAsyncResult result) 

                        request.ContentType = "application/x-www-form-urlencoded"; 

                        // HttpWebRequest.EndGetRequestStream(IAsyncResult) - 傳回用于将資料寫入某 URI 資源的 Stream 

                        Stream requestStream = request.EndGetRequestStream(result); 

                        StreamWriter streamWriter = new StreamWriter(requestStream); 

                        // byte[] postdata = System.Text.Encoding.UTF8.GetBytes("name=webabcd"); 

                        // 多個參數用“&amp;”分隔 

                        streamWriter.Write("name=webabcd"); 

                        streamWriter.Close(); 

                                response = request.EndGetResponse(result); 

                        // 調用 UI 線程 

                         *         ContentLength - 接收的資料的内容長度 

                         *         ContentType - HTTP 頭的 ContentType 部分 

                         *         Method - HTTP 方法 

                         *         ResponseUri - 響應該請求的 URI 

                         *         StatusCode - 響應狀态 [System.Net.HttpStatusCode枚舉] 

                         *                 HttpStatusCode.OK - HTTP 狀态為 200 

                         *                 HttpStatusCode.NotFound - HTTP 狀态為 404 

                         *         StatusDescription - 響應狀态的說明 

                        if (response != null &amp;&amp; response.StatusCode == HttpStatusCode.OK) 

                                        lblMsg.Text = string.Format("接收的資料的内容長度:{0}\r\nHTTP 頭的 ContentType 部分:{1}\r\nHTTP 方法:{2}\r\n響應該請求的 URI:{3}\r\n響應狀态:{4}\r\n響應狀态的說明:{5}\r\n響應的結果:{6}\r\n", 

                                                response.ContentLength, 

                                                response.ContentType, 

                                                response.Method, 

                                                response.ResponseUri, 

                                                response.StatusCode, 

                                                response.StatusDescription, 

                                                sr.ReadToEnd()); 

OK

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/343128,如需轉載請自行聯系原作者