前两节,我们对WebRequest和WebResponse这两个类做了介绍,但两者还相对独立。本节,我们来说说如何将两者结合起来,方式有哪些,有什么不同。

1.4.1 说结合,无非就是我们如何发送一个Request以及如何得到一个Response。

WebRequest提供了三组方法(Framework 4.6.1+,其它版本没去细看)

[Code 1.4.1]

1          public virtual WebResponse GetResponse();
2 ----------------------------------------------------------------------------------------------------
3          public virtual IAsyncResult BeginGetResponse(AsyncCallback callback, object state);
4          public virtual WebResponse EndGetResponse(IAsyncResult asyncResult);
5 ----------------------------------------------------------------------------------------------------
6          public virtual Task<WebResponse> GetResponseAsync();

这三组方法,都是用来获取Response的,而且,WebRequest也是在调用它们的时候,发送出去的。

这就是关于如何结合的全部内容,没有很复杂,复杂的内容在发送前的准备工作和接收后的处理工作:)

1.4.2 说方式,无非就是同步和异步。

还是看[Code 1.4.1],第1行,是同步方式,第3、4、6行是异步方式;不过除了这两组外,WebRequest还提供了对RequestStream获取的同步与异步操作方式:

[Code 1.4.2]

1         public virtual Stream GetRequestStream();
2 ---------------------------------------------------------------------------------------------------
3         public virtual IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state);
4         public virtual Stream EndGetRequestStream(IAsyncResult asyncResult);
5 ---------------------------------------------------------------------------------------------------
6         public virtual Task<Stream> GetRequestStreamAsync();

RequestStream是做什么用的?

举个栗子,我是个俊才,要向我心仪的姑娘提亲,于是呢,就要发起一个WebRequest了,Uri就相当于姑娘家的详细地址,甚至姑娘家有多位姑娘,我要向哪位姑娘提亲呢,也可以在Uri中点明。但是,既然是提亲,总得准备点儿礼物吧,可是礼物要么数量多(Uri里装不下)、要么珍贵,不想让外人看到,怎么办,于是乎,就有了RequestStream的用武之地,它就像是提亲的随行车队,我把礼物藏到车队里,这样我就可以给礼物编个码、压个缩、打个包、加个密、装个箱、上个锁(好像成本比礼物本身都高了,谁让咱穷呢)。

那为什么需要异步的方式呢,还是拿上面的栗子来解释吧,车队虽好,不过我可没有那么多车,要么跟亲戚朋友借,要么找婚庆公司预约,同步的方式就是我亲自去借车,其它什么都不干了,就等着车队到齐(先不考虑别人不借给我的尴尬场面)。异步方式呢,就是我打电话,告诉各位,我要借车,赶紧把车开过来,撂下电话,我也不闲着,赶紧给礼物编个码、压个缩、打个包、加个密、装个箱、上个锁……等车来齐了,就可以装车出发了~

好,理呢,就是这么个理,开始动手干。

先拿同步方式开刀。

 1     using System;
 2     using System.IO;
 3     using System.Net;
 4     using System.Text;
 5
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             var request = WebRequest.Create(@"https://www.cnblogs.com/mikecheers/p/12090487.html");
11             request.Method = WebRequestMethods.Http.Get;
12             using (var response = request.GetResponse()) // 结合点,同步方式获取Response
13             {
14                 using (var stream = response.GetResponseStream())
15                 {
16                     using (var reader = new StreamReader(stream, new UTF8Encoding(false)))
17                     {
18                         var content = reader.ReadToEnd();
19                         Console.WriteLine(content);
20                     }
21                 }
22                 response.Close();
23             }
24             request.Abort();
25             Console.ReadLine();
26         }
27     }

细心的同学,会发现,这不就是第二节开篇的示例麽。没错,就是它,你能拿我怎么滴……

重点是异步怎么实现:P

有点儿累,未完待续……

02-11 09:40