稳扎稳打Silverlight(21) - 2.0通信之WebRequest和WebResponse, 对指定的URI发出请求以及接收响应

2016-08-20 11:00:20来源:http://webabcd.blog.51cto.com/1787395/343128作者:webabcd人点击


[索引页][源码下载]
稳扎稳打Silverlight(21) - 2.0通信之WebRequest和WebResponse, 对指定的URI发出请求以及接收响应作者:webabcd介绍Silverlight 2.0 详解WebRequest和WebResponse,对指定的URI做GET和POST请求,以及接收其响应 HttpWebRequest - 对指定的 URI 发出请求 Create() - 初始化一个 WebRequest BeginGetResponse() - 开始对指定 URI 资源做异步请求 EndGetResponse() - 结束对指定 URI 资源做异步请求 HttpWebResponse - 对指定的 URI 做出响应 GetResponseStream() - 获取响应的数据流在线DEMOhttp://webabcd.blog.51cto.com/1787395/342779示例1、对指定的URI做GET请求以及接收响应WebRequestGet.xaml

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

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

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


OK[源码下载]

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台