前两节,我们对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
有点儿累,未完待续……