俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

.Net WebRequest异步请求与WebClient异步请求

很多情况下一般会使用同步方式发出请求,直到响应后再做后续的逻辑处理等,但有时候后续的逻辑处理不依赖于请求的结果或者是可以挂起等到响应后再处理,又或者是为了解决UI“假死”的现象,这时可以使用异步请求

[索引页]
[源码下载]

使用WebRequest实例中的BeginGetResponse方法异步获取响应结果,其中参数callback是委托类型,state是自定义的对象,state用于保存一些信息,在callback对应的方法中可能需要用到这些信息。

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

下面用一个例子说明,假设需要请求url,该url对应是一张图片,异步获取后展示到PictureBox中(该例子基于winform的一个窗体中)

作者:webabcd

winform中定义了存放数据的变量

介绍
Silverlight 2.0 详解WebRequest和WebResponse,对指定的URI做GET和POST请求,以及接收其响应
    HttpWebRequest - 对指定的 URI 发出请求
        Create() - 初始化一个 WebRequest
        BeginGetResponse() - 开始对指定 URI 资源做异步请求
        EndGetResponse() - 结束对指定 URI 资源做异步请求
    HttpWebResponse - 对指定的 URI 做出响应
        GetResponseStream() - 获取响应的数据流

List<byte> lstBuffer = new List<byte>();
byte[] buffers = new byte[8];

在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html

在具体需要请求服务器的地方创建WebRequest实例,并调用BeginGetResponse方法

示例
1、对指定的URI做GET请求以及接收响应
WebRequestGet.xaml

string url = "http://localhost/1.jpg";
var request = WebRequest.Create(url);
request.BeginGetResponse(RespCallBack, request);

RespCallBack方法如下,此处ar.AsyncState也就是上面调用BeginGetResponse方法中参数state对应的信息,也就是request

private void RespCallBack(IAsyncResult ar)
{
    var request = ar.AsyncState as WebRequest;
    var response = request?.EndGetResponse(ar);
    Stream responseStream = response?.GetResponseStream();
    responseStream?.BeginRead(buffers, 0, 8, ReadCallBack, responseStream);
}

俄罗斯贵宾会 1<UserControl x:Class="Silverlight20.Communication.WebRequestGet"
俄罗斯贵宾会 2    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation
俄罗斯贵宾会 3    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&gt;
俄罗斯贵宾会 4    <StackPanel HorizontalAlignment="Left" Margin="5">
俄罗斯贵宾会 5    
俄罗斯贵宾会 6        <TextBlock x:Name="lblMsg" />
俄罗斯贵宾会 7        
俄罗斯贵宾会 8    </StackPanel>
俄罗斯贵宾会 9</UserControl>
俄罗斯贵宾会 10

由于是异步,此处读数据也是异步读取,ReadCallBack如下:

WebRequestGet.xaml.cs

private void ReadCallBack(IAsyncResult ar)
{
    using (var responseStream = ar.AsyncState as Stream)
    {
        if (responseStream == null) return;
        var read = responseStream.EndRead(ar);
        if (read > 0)
        {
            lstBuffer.AddRange(buffers);
            responseStream.BeginRead(buffers, 0, 8, ReadCallBack, responseStream);
        }
        else
        {
            lstBuffer.AddRange(buffers);
            Stream s = new MemoryStream(lstBuffer.ToArray());
            pictureBox1.Image = Image.FromStream(s);
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
            responseStream.Dispose();
        }
    }
}

俄罗斯贵宾会 11using System;
俄罗斯贵宾会 12using System.Collections.Generic;
俄罗斯贵宾会 13using System.Linq;
俄罗斯贵宾会 14using System.Net;
俄罗斯贵宾会 15using System.Windows;
俄罗斯贵宾会 16using System.Windows.Controls;
俄罗斯贵宾会 17using System.Windows.Documents;
俄罗斯贵宾会 18using System.Windows.Input;
俄罗斯贵宾会 19using System.Windows.Media;
俄罗斯贵宾会 20using System.Windows.Media.Animation;
俄罗斯贵宾会 21using System.Windows.Shapes;
俄罗斯贵宾会 22
俄罗斯贵宾会 23using System.Threading;
俄罗斯贵宾会 24using System.IO;
俄罗斯贵宾会 25
俄罗斯贵宾会 26namespace Silverlight20.Communication
俄罗斯贵宾会 27俄罗斯贵宾会 28俄罗斯贵宾会 29{
俄罗斯贵宾会 30    public partial class WebRequestGet : UserControl
俄罗斯贵宾会 31俄罗斯贵宾会 32    俄罗斯贵宾会 33{
俄罗斯贵宾会 34        // 接收 GET 方式数据的 REST 服务
俄罗斯贵宾会 35        string _url = "http://localhost:3036/REST.svc/Users/json";
俄罗斯贵宾会 36
俄罗斯贵宾会 37俄罗斯贵宾会,        // 异常信息
俄罗斯贵宾会 38        string _exception = "";
俄罗斯贵宾会 39        
俄罗斯贵宾会 40        // SynchronizationContext - 同步上下文管理类
俄罗斯贵宾会 41        SynchronizationContext _syncContext;
俄罗斯贵宾会 42
俄罗斯贵宾会 43        public WebRequestGet()
俄罗斯贵宾会 44俄罗斯贵宾会 45        俄罗斯贵宾会 46{
俄罗斯贵宾会 47            InitializeComponent();
俄罗斯贵宾会 48
俄罗斯贵宾会 49            Demo();
俄罗斯贵宾会 50        }
俄罗斯贵宾会 51
俄罗斯贵宾会 52        void Demo()
俄罗斯贵宾会 53俄罗斯贵宾会 54        俄罗斯贵宾会 55{
俄罗斯贵宾会 56            // SynchronizationContext.Current - 当前线程的同步上下文
俄罗斯贵宾会 57            _syncContext = SynchronizationContext.Current;
俄罗斯贵宾会 58
俄罗斯贵宾会 59俄罗斯贵宾会 60            /**//*
俄罗斯贵宾会 61             * HttpWebRequest - 对指定的 URI 发出请求
俄罗斯贵宾会 62             *     HttpWebRequest.Create(uri) - 初始化一个 WebRequest
俄罗斯贵宾会 63             *     HttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state) - 开始对指定 URI 资源做异步请求
俄罗斯贵宾会 64             *         AsyncCallback callback - System.AsyncCallback 委托。异步操作完成时调用的回调方法
俄罗斯贵宾会 65             *         Object state - 包含此异步请求的对象。即相应的 HttpWebRequest 对象
俄罗斯贵宾会 66             *     HttpWebRequest.Abort() - 取消该异步请求
俄罗斯贵宾会 67             *     HttpWebRequest.Accept - HTTP 头的 Accept  部分
俄罗斯贵宾会 68             *     HttpWebRequest.ContentType - HTTP 头的 ContentType 部分
俄罗斯贵宾会 69             *     HttpWebRequest.Headers - HTTP 头的 key/value 对集合
俄罗斯贵宾会 70             *     HttpWebRequest.Method - HTTP 方法(只支持GET和POST)
俄罗斯贵宾会 71             *     HttpWebRequest.RequestUri - 所请求的 URI
俄罗斯贵宾会 72             *     HttpWebRequest.HaveResponse - 是否接收到了指定 URI 的响应
俄罗斯贵宾会 73             *     HttpWebRequest.AllowReadStreamBuffering - 是否对从 Internet 资源接收的数据做缓冲处理。默认值为true,将数据缓存在客户端内存中,以便随时被应用程序读取
俄罗斯贵宾会 74             */
俄罗斯贵宾会 75
俄罗斯贵宾会 76            HttpWebRequest request = WebRequest.Create(
俄罗斯贵宾会 77                new Uri(_url, UriKind.Absolute)) as HttpWebRequest;
俄罗斯贵宾会 78            request.Method = "GET";
俄罗斯贵宾会 79            request.BeginGetResponse(new AsyncCallback(ResponseCallback), request);
俄罗斯贵宾会 80        }
俄罗斯贵宾会 81
俄罗斯贵宾会 82        private void ResponseCallback(IAsyncResult result)
俄罗斯贵宾会 83俄罗斯贵宾会 84        俄罗斯贵宾会 85{
俄罗斯贵宾会 86            // IAsyncResult.AsyncState - AsyncCallback 传过来的对象
俄罗斯贵宾会 87            HttpWebRequest request = result.AsyncState as HttpWebRequest;
俄罗斯贵宾会 88
俄罗斯贵宾会 89            WebResponse response = null;
俄罗斯贵宾会 90
俄罗斯贵宾会 91            try
俄罗斯贵宾会 92俄罗斯贵宾会 93            俄罗斯贵宾会 94{
俄罗斯贵宾会 95                // HttpWebRequest.EndGetResponse(IAsyncResult) - 结束对指定 URI 资源做异步请求
俄罗斯贵宾会 96                //     返回值为 WebResponse 对象
俄罗斯贵宾会 97                response = request.EndGetResponse(result) as HttpWebResponse;
俄罗斯贵宾会 98            }
俄罗斯贵宾会 99            catch (Exception ex)
俄罗斯贵宾会 100俄罗斯贵宾会 101            俄罗斯贵宾会 102{
俄罗斯贵宾会 103                _exception = ex.ToString();
俄罗斯贵宾会 104            }
俄罗斯贵宾会 105
俄罗斯贵宾会 106            // SynchronizationContext.Post(SendOrPostCallback d, Object state) - 将异步消息发送到该同步上下文中
俄罗斯贵宾会 107            //     SendOrPostCallback d - System.Threading.SendOrPostCallback 委托
俄罗斯贵宾会 108            //     Object state - 需要传递的参数
俄罗斯贵宾会 109            _syncContext.Post(GetResponse, response);
俄罗斯贵宾会 110        }
俄罗斯贵宾会 111
俄罗斯贵宾会 112        private void GetResponse(object state)
俄罗斯贵宾会 113俄罗斯贵宾会 114        俄罗斯贵宾会 115{
俄罗斯贵宾会 116俄罗斯贵宾会 117            /**//*
俄罗斯贵宾会 118             * HttpWebResponse - 对指定的 URI 做出响应
俄罗斯贵宾会 119             *     GetResponseStream() - 获取响应的数据流
俄罗斯贵宾会 120             */
俄罗斯贵宾会 121
俄罗斯贵宾会 122            HttpWebResponse response = state as HttpWebResponse;
俄罗斯贵宾会 123
俄罗斯贵宾会 124            if (response != null)
俄罗斯贵宾会 125俄罗斯贵宾会 126            俄罗斯贵宾会 127{
俄罗斯贵宾会 128                Stream responseStream = response.GetResponseStream();
俄罗斯贵宾会 129                using (StreamReader sr = new StreamReader(responseStream))
俄罗斯贵宾会 130俄罗斯贵宾会 131                俄罗斯贵宾会 132{
俄罗斯贵宾会 133                    lblMsg.Text = sr.ReadToEnd();
俄罗斯贵宾会 134                }
俄罗斯贵宾会 135            }
俄罗斯贵宾会 136            else
俄罗斯贵宾会 137俄罗斯贵宾会 138            俄罗斯贵宾会 139{
俄罗斯贵宾会 140                lblMsg.Text = _exception;
俄罗斯贵宾会 141            }
俄罗斯贵宾会 142        }
俄罗斯贵宾会 143    }
俄罗斯贵宾会 144}
俄罗斯贵宾会 145

本文由俄罗斯贵宾会发布于编程,转载请注明出处:.Net WebRequest异步请求与WebClient异步请求

您可能还会对下面的文章感兴趣: