Windows Phone 7 – WebClient与HttpWebRequest的使用差别

这篇文章将先针对WebClient做说明,另外会接着介绍相关于HttpWebRequest的使用,以及这二个类别之间的差异与对于WP7的一个影响。

在讨论WebClient与HttpWebRequest之前,要先了解一下一个蛮重要的类别:WebRequest类别。

‧WebRequest

它是.NET Framework进行处理网际网路资源要求(WebRequest)与回应(WebResponse)的主要模型。属于Abstract类别。没有办法直接透过建构子实作,需使用:WebRequest.Create方法来建立实体来进行运用。该类别还有其他相关不同于通讯协定的类别,包括:WebRequestMethod.File、WebRequestMethod.Ftp与WebRequestMethod.Http。更详细的使用方法,可以参考< 如何使用WebRequest类别要求资料 >这篇有详细的说明。


然而,在Silverlight所支援的Syste.Netm命名空间里,目前仅支援:WebRequest、WebResponse、WebClient与HttpWebRequest等类别,虽然缺少了WebRequestMethod.Ftp或FtpWebRequest就代表Silverlight没法支援FTP了吗?答案是否定的。因为WebClient还是可以做到相同的效果(但需注意Timeout问题),因为WebClient是一个非常特别好用的封装后类别,让我们开发人员非常容易就可以撰写出撷取网路资源的程式。另外,也可以参考以下的文章:Silverlight 3 File Transfer Application


那么接下来就回到主题里,谈论相关于Silverlight下的WebClient与HttpWebRequest二个常用于Silverlight的类别。

‧WebClient

WebClient使用WebRequest类别提供对资源的存取。WebClient类别相较于HttpWebRequest类别,它比较像是个被封装完成专门处理网路资源存取的类别,例如:依照预设值,当使用WebClient时,该执行个体是不会传送选择性的Http标头,也就是它会依旧你使用的URI产生相对应的Http Header内容,让接收端可以有效撷取需要的内容。这样的好处可以让开发人员依基本的Header来完成任务。但其实对于Header的使用,还是有其限制在的,可以参考

< WebHeaderCollection类别 >这篇文章的介绍,里面提供了那些Header可以操作来向接收端进行沟通。

Method

Description

OpenWriteAysnc

以非同步方式撷取用于将资料传送至资源的Stream,而不封锁呼叫的执行绪。使用POST命令上载HTTP资源。该方法将资料转入资料流中进行传送。

UploadStringAsync

String传送至资源,而不封锁呼叫的执行绪。指定上传的URI必须识别出可以接受使用POST方法传送之要求的资源。

DownloadStringAsync

从资源下载String,而不封锁呼叫的执行绪。采用GET方法向URI下载指定资源。

OpenReadAsync

以非同步方式从资源传回资料,而不封锁呼叫的执行绪。采用下载封装的方式,让资源回传时是属于一个独立的档案集合。采用GET方法向URI下载指定资源。

上方四种是常用于非同步作业使用的方法。然而在使用WebClient类别需要注意Silverlight针对网路存取的限制,可以参考:< Silverlight中的网路安全性存取限制 >与< Silverlight中的URL存取限制 >。另外,也许你会像我一样不太了解为何有一个DownloadStringAsync或UploadStringAsync的方法出现,因为在网路上搜寻看到WebClient类别的范例都是使用另外二种:OpenWriteAsync与OpenReadAsync来储存网路资源。也许你可以依照下方的分类来按需求使用:

〉DownloadStringAsync/Uplo​​adStringAsync:适用于当接收端接受传送资料的类型,例如:XML、JSON等其他相关文字类型。

〉OpenWriteAsync/OpenReadAsync:适用接收端使用POST方式接收/取得资料流的类型,例如:可转成Stream的资料料型。


HttpWebRequest

它是WebRequest的子代类别,实作WebRequest提供的方法与属性,主要针对Http Protocol进行处理,内部包括了Header、Content等一般在ASP.NET网页中Request看到的属性。让用户可以直接与Http伺服器进行沟通,例如:Get或Post。它使用的方法,如同WebRequest类别的用法:WebRequest.Create根据URI中的http或https回传HttpWebRequest物件。

然而使用HttpWebRequest特别注意:「Silverlight执行阶段会限制HttpWebReuqest类别从特定的Header传送到跨网域网站」该限制主要是避免程式进行跨网域存取的问题,造成类别跨网域攻击的事件发生,也能确保资源是安全与规范下的存取。另外,更详细说明安全性的问题可以参考:< Silverlight中的网路安全性存取限制 >与< Silverlight中的URL存取限制 >。


主要使用的Method:

Method Name

Description

BeginGetResponse

开始对网际网路资源的非同步要求。

EndGetResponse

结束对网际网路资源的非同步要求。需使用IAsyncResult处理回传结果。

BeginGetRequestStream

开始用来写入资料之Stream物件的非同步要求。

EndGetRequestStream

结束用来写入资料之Stream物件的非同步要求。需使用IAsyncResult处理回传结果。

以上二组方法均是Request/Response的相对应(另外还有GetResponse()等支援同步作业的方法)。由于二者均属于非同步的呼叫,因此另外有二个重要的类别需要注意:

AsyncCallback委派

提供让用户端应用程式完成非同步的作业。在启始非同步作业时,提供户用端这个回呼委派。AysncCallback所参考的事件处理常式包含完成处理非同步作业的工作逻辑。然而回传的结果则语IAsyncResult介面来控制。


IAsyncResult介面

由执行非同步作业方法的类别所实作。代表非同步作业开始与结​​束的回传型别(Return Type)。它会配搭非同步作业完成时,交由AsyncCallback委派所叫用(invoke)的方法回传资讯。


以下举了一个简单的使用范例:

我实作了一个Default.aspx的网页,接受透过GET的方法把User的帐号与密码送到该网页来取​​得验证的动作。(范例有点不好,但重点在说明如何使用HttpWebRequest类别)。

private void button1_Click( object sender, RoutedEventArgs e)

{

//建立HttpWebReuqest实体

HttpWebRequest tHReuqest = WebRequest.CreateHttp( "http://localhost:1294/Default.aspx?UID=pou&PWD=pou1234" );

//使用AsyncCallback委派,来完成非同步的作业。

tHReuqest.BeginGetResponse( new AsyncCallback(ResponseCallback), tHReuqest);

}

private void ResponseCallback(IAsyncResult asynchronousResult)

{

//使用AsyncCallback委派需要实作IAsyncResult介面来取得非同步作业的状态。

HttpWebRequest tRequest = (HttpWebRequest)asynchronousResult.AsyncState;

HttpWebResponse tResponse = (HttpWebResponse)tRequest.EndGetResponse(asynchronousResult);

using (StreamReader tResponseStream = new StreamReader(tResponse.GetResponseStream()))

{

string strResult = tResponseStream.ReadToEnd();

//将Response内容读入后,透过呼叫UI Thread来修改画面中元件的显示。

Dispatcher.BeginInvoke(() =>

{

textBox1.Text = strResult;

});

}

}

‧WebClient & HttpWebRequest 不同之处

WebClient与HttpWebReuqest对于我刚学习Silverlight时,我一直搞不清楚何该用那一种类型会比较适用,也许你参考过这一篇< Using WebClient and HttpWebRequest >,它里面也提及由于二个类别使用,如果是用于比较单纯的情境(例如:单纯透过GET去取得指定URI所回传的内容或档案),二者的差异是比较小的,也就比较容易造成混淆。但是如果按照上述所描述二者各自的用途与功能后,可以容易将二者的差异,透过从下方一段话来加以分解:


〉WebClient:使用容易,直接使用即可用于撷取或下载Web Service上的资源与内容,甚至支援FTP。

〉HttpWebRequest:使用较复杂,但提供丰富的功能于自订需要的Header或是其他的资源,协助完成特定工作。


的确,WebClient的使用上,其实不用太过于在意Http Header上参数的控制与应用,相对于HttpWebReqeust使用是非常简单的( 但这不表示WebClient就不能调整需要的Header内容,可透过WebClient的Header属性来调整需要的Header )。

以上这只是个简单的分类,实际的使用情境与考虑的因素,我们可以参考以下这一篇的内容:


< 使用Silverlight的HTTP通讯和安全性 >,我将摘录其中我觉得比较重要的部分,可以协助刚学习Silverlight时,可以清楚的理解二者之间的差异性。


〉HTTP 通讯情节和建议做法

以下此表主要撷录< 使用Silverlight的HTTP通讯和安全性 >中的"HTTP通讯情节和建议做法"来加以说明:

序号

情节

建议方式

1

在相同网域中,下载及上载资源。

使用WebClient类别。如需详细资讯,请参阅视需要下载内容

2

呼叫装载于相同网域中的HTTP 架构Web 服务。

使用WebClient类别或HttpWebRequest / HttpWebResponse类别。如需详细资讯,请参阅HOW TO:对以HTTP为基础的服务发出要求[SilverLT4]

3

呼叫装载于相同网域中的SOAP、WCF 或ASP.NET AJAX Web 服务。

呼叫为Web服务所产生的Proxy。如需详细资讯,请参阅使用Proxy建置和存取服务[Silverlight]

如果您不想要使用Proxy,请使用HttpWebRequest / HttpWebResponse类别。

4

处理来自Web 服务的XML、JSON 或RSS 资料。

使用WebClient类别或HttpWebRequest / HttpWebResponse类别。如需详细资讯,请参阅直接存取以HTTP和REST为基础的服务[SilverLT4]HOW TO:使用LINQ to XML从任意URI位置载入XML档案

5

呼叫位​​于不同网域上的Web 服务。

确定用户端存取原则档位于网域根目录。使用Proxy、WebClient类别或HttpWebRequest / HttpWebResponse类别。如需详细资讯,请参阅让服务可跨网域界限使用[SilverLT4]

6

传送PUT、DELETE 和其他HTTP 方法,包括自订方法。

确定用户端存取原则启用其他HTTP方法。请指定用户端HTTP处理,并依照一般方式使用HttpWebRequest / HttpWebResponse类别。如需指定用户端HTTP处理的详细资讯,请参阅HOW TO:指定浏览器或用户端HTTP处理

7

对跨网域POST 要求设定要求标头。

确定依用户端存取原则档允许标头。

对于有关资料上载的要求标头,请使用WebClient类别。将其Headers属性设定为所需的标头集合。

针对其他案例,请使用HttpWebRequest类别。将其Headers属性设定为所需的标头集合。如需允许的标头清单,请参阅HttpWebRequest.Headers

8

使用所有方法传送要求标头。

请指定用户端HTTP处理,并依照一般方式使用HttpWebRequest / HttpWebResponse类别,同时视需要设定Headers属性。

9

传送要求至传回错误码和SOAP 错误的SOAP 服务

请指定用户端HTTP处理,并依照一般方式使用HttpWebRequest / HttpWebResponse类别,以撷取发生错误的讯息主体。如需指定用户端HTTP处理的详细资讯,请参阅HOW TO:指定浏览器或用户端HTTP处理

10

将GET 要求传送至需要Referer 标头的Web 服务。

请指定用户端HTTP处理,并依照一般方式使用HttpWebRequest / HttpWebResponse类别。如需指定用户端HTTP处理的详细资讯,请参阅HOW TO:指定浏览器或用户端HTTP处理

从上表举出的情境都是在使用WebClient或HttpWebRequest常遇到的,然而你可以从序号:1、2、4与7这四个情境发现,WebClient使用的情境均比较属于单纯的情境,例如:上传、下载或常见的Header标题应用。另外:HttpWebReqeust提供的使用情境,就包括比较丰富的客制Http Header应用,指定的Web Service、WCF或特定Http Method的应用。上表只能提供一个大概的应用模式。其实还是需要按照开发时遇到的情境为主才能找到适用的方法与内容。


另外,更要特别注意Silverlight在于跨网域限制的定义与相对应作业(重点:Silverlight针对不同网域存取时,会先向另一个网域要求一份"用户端存取原则档/跨网域原则档",根据原则中定义的规格来识别该服务是否支援跨网域的应用)。补充下列几篇文章有定义原则档的说明与安全性定义:< 让服务可跨网域界限使用[SilverLT4] >与< 服务存取的其他安全性考量[SilverLT4] >。


以上是自我整理阅读WebClient与HttpWebRequest二种类别上的小小心得,因为二者的使用本身也还没有用的非常深入,只能照目前阅读的结果提供一些简单的归纳。希望能有所帮助。感谢。如果有错误,也请多指导。谢谢。

 

 

http://www.hugwp.com/thread-2736-1.html

原文地址:https://www.cnblogs.com/zziss/p/2735970.html