HttpWebResponse

 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需要获取认证信息(如Cookie),所以返回的是HttpWebResponse对象,有了返回的HttpWebResponse实例,可以获取登录过程中返回的会话信息,也可以获取响应流。
 代码如下:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Net.Security;  
using System.Security.Cryptography.X509Certificates;  
using System.DirectoryServices.Protocols;  
using System.ServiceModel.Security;  
using System.Net;  
using System.IO;  
using System.IO.Compression;  
using System.Text.RegularExpressions;  
/*   
 * 作者:周公(zhoufoxcn)   
 * 日期:2011-05-08   
 * 原文出处:http://blog.csdn.net/zhoufoxcnhttp://zhoufoxcn.blog.51cto.com   
 * 版权说明:本文可以在保留原文出处的情况下使用于非商业用途,周公对此不作任何担保或承诺。   
 * */ 
namespace BaiduCang  
{  
    /// <summary>  
    /// 有关HTTP请求的辅助类  
    /// </summary>  
    public class HttpWebResponseUtility  
    {  
        private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";  
        /// <summary>  
        /// 创建GET方式的HTTP请求  
        /// </summary>  
        /// <param name="url">请求的URL</param>  
        /// <param name="timeout">请求的超时时间</param>  
        /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
        /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>  
        /// <returns></returns>  
        public static HttpWebResponse CreateGetHttpResponse(string url,int? timeout, string userAgent,CookieCollection cookies)  
        {  
            if (string.IsNullOrEmpty(url))  
            {  
                throw new ArgumentNullException("url");  
            }  
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;  
            request.Method = "GET";  
            request.UserAgent = DefaultUserAgent;  
            if (!string.IsNullOrEmpty(userAgent))  
            {  
                request.UserAgent = userAgent;  
            }  
            if (timeout.HasValue)  
            {  
                request.Timeout = timeout.Value;  
            }  
            if (cookies != null)  
            {  
                request.CookieContainer = new CookieContainer();  
                request.CookieContainer.Add(cookies);  
            }  
            return request.GetResponse() as HttpWebResponse;  
        }  
        /// <summary>  
        /// 创建POST方式的HTTP请求  
        /// </summary>  
        /// <param name="url">请求的URL</param>  
        /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>  
        /// <param name="timeout">请求的超时时间</param>  
        /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
        /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>  
        /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>  
        /// <returns></returns>  
        public static HttpWebResponse CreatePostHttpResponse(string url,IDictionary<string,string> parameters,int? timeout, string userAgent,Encoding requestEncoding,CookieCollection cookies)  
        {  
            if (string.IsNullOrEmpty(url))  
            {  
                throw new ArgumentNullException("url");  
            }  
            if(requestEncoding==null)  
            {  
                throw new ArgumentNullException("requestEncoding");  
            }  
            HttpWebRequest request=null;  
            //如果是发送HTTPS请求  
            if(url.StartsWith("https",StringComparison.OrdinalIgnoreCase))  
            {  
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);  
                request = WebRequest.Create(url) as HttpWebRequest;  
                request.ProtocolVersion=HttpVersion.Version10;  
            }  
            else 
            {  
                request = WebRequest.Create(url) as HttpWebRequest;  
            }  
            request.Method = "POST";  
            request.ContentType = "application/x-www-form-urlencoded";  
              
            if (!string.IsNullOrEmpty(userAgent))  
            {  
                request.UserAgent = userAgent;  
            }  
            else 
            {  
                request.UserAgent = DefaultUserAgent;  
            }  
 
            if (timeout.HasValue)  
            {  
                request.Timeout = timeout.Value;  
            }  
            if (cookies != null)  
            {  
                request.CookieContainer = new CookieContainer();  
                request.CookieContainer.Add(cookies);  
            }  
            //如果需要POST数据  
            if(!(parameters==null||parameters.Count==0))  
            {  
                StringBuilder buffer = new StringBuilder();  
                int i = 0;  
                foreach (string key in parameters.Keys)  
                {  
                    if (i > 0)  
                    {  
                        buffer.AppendFormat("&{0}={1}", key, parameters[key]);  
                    }  
                    else 
                    {  
                        buffer.AppendFormat("{0}={1}", key, parameters[key]);  
                    }  
                    i++;  
                }  
                byte[] data = requestEncoding.GetBytes(buffer.ToString());  
                using (Stream stream = request.GetRequestStream())  
                {  
                    stream.Write(data, 0, data.Length);  
                }  
            }  
            return request.GetResponse() as HttpWebResponse;  
        }  
 
        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)  
        {  
            return true; //总是接受  
        }  
    }  

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Net.Security;
 using System.Security.Cryptography.X509Certificates;
 using System.DirectoryServices.Protocols;
 using System.ServiceModel.Security;
 using System.Net;
 using System.IO;
 using System.IO.Compression;
 using System.Text.RegularExpressions;
 /* 
  * 作者:周公(zhoufoxcn) 
  * 日期:2011-05-08 
  * 原文出处:http://blog.csdn.net/zhoufoxcnhttp://zhoufoxcn.blog.51cto.com 
  * 版权说明:本文可以在保留原文出处的情况下使用于非商业用途,周公对此不作任何担保或承诺。 
  * */
 namespace BaiduCang
 {
     /// <summary>
     /// 有关HTTP请求的辅助类
     /// </summary>
     public class HttpWebResponseUtility
     {
         private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
         /// <summary>
         /// 创建GET方式的HTTP请求
         /// </summary>
         /// <param name="url">请求的URL</param>
         /// <param name="timeout">请求的超时时间</param>
         /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
         /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
         /// <returns></returns>
         public static HttpWebResponse CreateGetHttpResponse(string url,int? timeout, string userAgent,CookieCollection cookies)
         {
             if (string.IsNullOrEmpty(url))
             {
                 throw new ArgumentNullException("url");
             }
             HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
             request.Method = "GET";
             request.UserAgent = DefaultUserAgent;
             if (!string.IsNullOrEmpty(userAgent))
             {
                 request.UserAgent = userAgent;
             }
             if (timeout.HasValue)
             {
                 request.Timeout = timeout.Value;
             }
             if (cookies != null)
             {
                 request.CookieContainer = new CookieContainer();
                 request.CookieContainer.Add(cookies);
             }
             return request.GetResponse() as HttpWebResponse;
         }
         /// <summary>
         /// 创建POST方式的HTTP请求
         /// </summary>
         /// <param name="url">请求的URL</param>
         /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
         /// <param name="timeout">请求的超时时间</param>
         /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
         /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
         /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
         /// <returns></returns>
         public static HttpWebResponse CreatePostHttpResponse(string url,IDictionary<string,string> parameters,int? timeout, string userAgent,Encoding requestEncoding,CookieCollection cookies)
         {
             if (string.IsNullOrEmpty(url))
             {
                 throw new ArgumentNullException("url");
             }
             if(requestEncoding==null)
             {
                 throw new ArgumentNullException("requestEncoding");
             }
             HttpWebRequest request=null;
             //如果是发送HTTPS请求
             if(url.StartsWith("https",StringComparison.OrdinalIgnoreCase))
             {
                 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                 request = WebRequest.Create(url) as HttpWebRequest;
                 request.ProtocolVersion=HttpVersion.Version10;
             }
             else
             {
                 request = WebRequest.Create(url) as HttpWebRequest;
             }
             request.Method = "POST";
             request.ContentType = "application/x-www-form-urlencoded";
            
             if (!string.IsNullOrEmpty(userAgent))
             {
                 request.UserAgent = userAgent;
             }
             else
             {
                 request.UserAgent = DefaultUserAgent;
             }
 
             if (timeout.HasValue)
             {
                 request.Timeout = timeout.Value;
             }
             if (cookies != null)
             {
                 request.CookieContainer = new CookieContainer();
                 request.CookieContainer.Add(cookies);
             }
             //如果需要POST数据
             if(!(parameters==null||parameters.Count==0))
             {
                 StringBuilder buffer = new StringBuilder();
                 int i = 0;
                 foreach (string key in parameters.Keys)
                 {
                     if (i > 0)
                     {
                         buffer.AppendFormat("&{0}={1}", key, parameters[key]);
                     }
                     else
                     {
                         buffer.AppendFormat("{0}={1}", key, parameters[key]);
                     }
                     i++;
                 }
                 byte[] data = requestEncoding.GetBytes(buffer.ToString());
                 using (Stream stream = request.GetRequestStream())
                 {
                     stream.Write(data, 0, data.Length);
                 }
             }
             return request.GetResponse() as HttpWebResponse;
         }
 
         private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
         {
             return true; //总是接受
         }
     }
 }

 从上面的代码中可以看出POST数据到HTTP和HTTPS站点不同,POST数据到HTTPS站点的时候需要设置ServicePointManager类的ServerCertificateValidationCallback属性,并且在POST到https://passport.baidu.com/?login时还需要将HttpWebResquest实例的ProtocolVersion属性设置为HttpVersion.Version10(这个未验证是否所有的HTTPS站点都需要设置),否则在调用GetResponse()方法时会抛出“基础连接已经关闭: 连接被意外关闭。”的异常。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值