< UserControl x:Class ="Silverlight20.Communication.WebRequestGet" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" > < StackPanel HorizontalAlignment ="Left" Margin ="5" > < TextBlock x:Name ="lblMsg" /> </ StackPanel > </ UserControl >
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 < UserControl x:Class ="Silverlight20.Communication.WebRequestPost" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" > < StackPanel HorizontalAlignment ="Left" Margin ="5" > < TextBlock x:Name ="lblMsg" /> </ StackPanel > </ UserControl >
WebRequestPost.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 WebRequestPost : UserControl { // 接收 POST 方式数据的 REST 服务 string _url = " http://localhost:3036/REST.svc/PostUser "; // 异常信息 string _exception = ""; // SynchronizationContext - 同步上下文管理类 SynchronizationContext _syncContext; public WebRequestPost() { InitializeComponent(); Demo(); } void Demo() { _syncContext = SynchronizationContext.Current; HttpWebRequest request = WebRequest.Create( new Uri(_url, UriKind.Absolute)) as HttpWebRequest; 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) { HttpWebRequest request = result.AsyncState as HttpWebRequest; 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"); // 多个参数用“&”分隔 streamWriter.Write( " name=webabcd "); streamWriter.Close(); request.BeginGetResponse( new AsyncCallback(ResponseCallback), request); } private void ResponseCallback(IAsyncResult result) { HttpWebRequest request = result.AsyncState as HttpWebRequest; WebResponse response = null; try { response = request.EndGetResponse(result); } catch (Exception ex) { _exception = ex.ToString(); } // 调用 UI 线程 _syncContext.Post(GetResponse, response); } private void GetResponse( object state) { /**//* * HttpWebResponse - 对指定的 URI 做出响应 * GetResponseStream() - 获取响应的数据流 * ContentLength - 接收的数据的内容长度 * ContentType - HTTP 头的 ContentType 部分 * Method - HTTP 方法 * ResponseUri - 响应该请求的 URI * StatusCode - 响应状态 [System.Net.HttpStatusCode枚举] * HttpStatusCode.OK - HTTP 状态为 200 * HttpStatusCode.NotFound - HTTP 状态为 404 * StatusDescription - 响应状态的说明 */ HttpWebResponse response = state as HttpWebResponse; if (response != null && response.StatusCode == HttpStatusCode.OK) { Stream responseStream = response.GetResponseStream(); using (StreamReader sr = new StreamReader(responseStream)) { 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()); } } else { lblMsg.Text = _exception; } } } }