WebClient和HttpWebRequst区别

WebClient和HttpWebRequst是用来获取数据的2种方式,一般而言,WebClient更倾向于“按需下载”,事实上掌握它也是相对容易的,而HttpWebRequst则允许你设置请求头或者对内容需要更多的控制,后者有点类似于form中的submit。虽然两者都是异步请求事件,但是WebClient是基于事件的异步,而HttpWebRequst是基于代理的异步编程

WebClient封装了一下便于使用,但是需要稍微细节一些的操作的时候,就得用WebResponse和WebRequest来操作了。比如要想控制TCP链接数,自定义HTTP请求头或者Post自定义数据等等,HTTPWebRequest是专用于HTTP协议的WebRequest,想要灵活性选择后者,简单性选择前者,2.0里提供了FtpWebResponse...FileWebResponse,用起来可能选择范围更广点。

举例如下:

例如用WebClient类实现 
PageUrl = UrlText.Text; 
WebClient wc = new WebClient(); 
wc.Credentials = CredentialCache.DefaultCredentials;

Byte[] pageData = wc.DownloadData(PageUrl); 
ContentHtml.Text = Encoding.Default.GetString(pageData);


WebClient传递json数据
WebClient wc = new WebClient();
byte[] sendData = Encoding.GetEncoding("UTF-8").GetBytes(sb.ToString());
wc.Headers.Add("Content-Type", "application/json");
wc.Headers.Add("ContentLength", sendData.Length.ToString());
byte[] recData = wc.UploadData(url1, "POST", sendData);
#endregion

string result1 = Encoding.GetEncoding("UTF-8").GetString(recData);


用WebRequest类实现 
PageUrl = UrlText.Text; 
WebRequest request = WebRequest.Create(PageUrl); 
WebResponse response = request.GetResponse(); 
Stream resStream = response.GetResponseStream(); 
StreamReader sr = new StreamReader(resStream, System.Text.Encoding.Default); 
ContentHtml.Text = sr.ReadToEnd(); 
resStream.Close(); 
sr.Close();

这两段代码实现同样功能,区别在哪里? WebRequest类 
命名空间: System.Net

发出对统一资源标识符 (URI) 的请求。这是一个抽象(在 Visual Basic 中为 MustInherit)类。 
WebRequest 是 .NET Framework 的用于访问 Internet 数据的请求/响应模型的抽象(在 Visual Basic 中为 MustInherit)基类。使用该请求/响应模型的应用程序可以用协议不可知的方式从 Internet 请求数据。在这种方式下,应用程序处理 WebRequest 类的实例,而协议特定的子类则执行请求的具体细节。

请求从应用程序发送到某个特定的 URI,如服务器上的 Web 页。URI 从一个为应用程序注册的 WebRequest 子代列表中确定要创建的适当子类。注册 WebRequest 子代通常是为了处理某个特定的协议(如 HTTP 或 FTP),但是也可以注册它以处理对特定服务器或服务器上的路径的请求。

WebClient 类: 
提供向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法。不能继承此类。 
WebClient 类提供向 URI 标识的任何本地、Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法。

WebClient 类使用 WebRequest 类提供对 Internet 资源的访问。WebClient 实例可以通过任何已向 WebRequest.RegisterPrefix 方法注册的 WebRequest 子代访问数据。 
详细的,查看一下msdnnull WebClient 不支持超时设定,这一点太糟糕了。因此选用HttpWebRequest代替WebClient : HttpWebRequest毕竟是WebClient 的父类,因此POST起来比较麻烦。 
//data  
string cookieStr = "51fd9f14fa7561b5";  
string postData = string.Format("userid={0}&password={1}", "guest", "123456");  
byte[] data = Encoding.UTF8.GetBytes(postData);  

// Prepare web request...  
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.xxx.com");  
request.Method = "POST";  
//request.Referer = "https://www.xxx.com";  
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";  
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";  
//request.Host = "www.xxx.com";  
request.Headers.Add("Cookie", cookieStr);  
request.ContentLength = data.Length;  
Stream newStream = request.GetRequestStream();  

// Send the data.  
newStream.Write(data, 0, data.Length);  
newStream.Close();  

// Get response  
HttpWebResponse myResponse = (HttpWebResponse)request.GetResponse();  
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);  
string content = reader.ReadToEnd();  
Console.WriteLine(content);  
Console.ReadLine();  

猜你喜欢

转载自blog.csdn.net/smartsmile2012/article/details/78623241
今日推荐