HttpWebRequest,HttpWebResponse 使用
目的:工作中已经两次使用了,特此记录一下,并写好注释
/// <summary>
/// HttpWebRequest的基本配置
/// </summary>
public class HttpConfig
{
/// <summary>
/// 协议:http/https
/// </summary>
public string protocol
{
set;
get;
} /// <summary>
/// 发送端发送的数据格式
/// </summary>
public string contentType
{
set;
get;
} /// <summary>
/// 客户端希望接受的数据类型
/// </summary>
public string accept
{
set;
get;
} /// <summary>
/// 标识请求者的一些信息,如浏览器类型和版本、操作系统,使用语言等信息(IE,Firefox以“Mozilla/....”开头)
/// </summary>
public string userAgent
{
set;
get;
} /// <summary>
/// 超时时间
/// </summary>
public int timeOut
{
set;
get;
} /// <summary>
/// 请求body的编码类型:utf-8/gbk2312/gbk
/// </summary>
public string encoding
{
set;
get;
} /// <summary>
/// 请求方式:GET/POST
/// </summary>
public string method
{
set;
get;
} /// <summary>
/// 是否保持持续连接。默认为true
/// </summary>
public bool keepAlive
{
set;
get;
} /// <summary>
/// cookie集合
/// </summary>
public CookieContainer cc = null; /// <summary>
/// http header集合
/// </summary>
public WebHeaderCollection whc = null; public HttpConfig()
{
protocol = "http";
contentType = "application/xml;charset=utf-8";
accept = "application/xml";
userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
timeOut = 15;
encoding = "utf-8";
method = "POST";
keepAlive = false;
} public HttpConfig(Dictionary<string, string> dctCookieKeyValus, string Domain, Dictionary<string, string> dctHeaderKeyValus)
: this()
{
GetCookieContainer(dctCookieKeyValus, Domain);
GetWebHeaderCollection(dctHeaderKeyValus);
} /// <summary>
/// 设置cookies
/// </summary>
/// <param name="dctKeyValus"></param>
/// <param name="Domain"></param>
public void GetCookieContainer(Dictionary<string, string> dctKeyValus, string Domain)
{
if (dctKeyValus.Count > 0)
{
cc = new CookieContainer();
foreach (string key in dctKeyValus.Keys)
{
Cookie cookie = new Cookie(key, dctKeyValus[key]);
cookie.Domain = "";
cc.Add(cookie);
}
}
} /// <summary>
/// 设置httpheaders
/// </summary>
/// <param name="dctKeyValus"></param>
public void GetWebHeaderCollection(Dictionary<string, string> dctKeyValus)
{
if (dctKeyValus.Count > 0)
{
whc = new WebHeaderCollection();
foreach (string key in dctKeyValus.Keys)
{
whc.Add(string.Format("{0}:{1}", key, dctKeyValus[key]));
}
}
}
} public class HttpRequestAndResponse
{
HttpConfig httpConfig = null; public HttpRequestAndResponse(HttpConfig httpconfig)
{
httpConfig = httpconfig;
} /// <summary>
/// 调过https验证
/// </summary>
private static bool CheckValidationResult(object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors errors)
{
return true;
} public string RequestAndResponse(string url, string requestXML, ref string errString)
{
string response = "";
HttpWebRequest req = null;
HttpWebResponse res = null;
try
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(CheckValidationResult); /*最大并接数*************************************************************/
ServicePointManager.DefaultConnectionLimit = 200;//最大并发连接数
//如果写在配置文件里 app.config
// <system.net>
// <connectionManagement>
// <!--表示把对任何域名的请求最大http连接数都设置为200-->
// <add address = "*" maxconnection = "200" />
// </connectionManagement>
//</system.net> req = WebRequest.Create(url) as HttpWebRequest; /*HttpWebRequest的基本属性设置*************************************************************/
req.ProtocolVersion = HttpVersion.Version10;
req.UserAgent = httpConfig.userAgent;
req.KeepAlive = httpConfig.keepAlive;
req.Timeout = 1000 * httpConfig.timeOut;
req.Method = httpConfig.method;
req.Accept = httpConfig.accept;
req.ContentType = httpConfig.contentType; /*写入http头部信息*************************************************************************/
if (httpConfig.whc != null)
req.Headers = httpConfig.whc; /*cookie拼接*************************************************************/
if (httpConfig.cc != null)
req.CookieContainer = httpConfig.cc; /*写入requestXML***************************************************************************/
if (!string.IsNullOrEmpty(requestXML))
{
byte[] bytes = System.Text.Encoding.GetEncoding(httpConfig.encoding).GetBytes(requestXML);
if (bytes.Length > 0)
{
req.ContentLength = bytes.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bytes, 0, bytes.Length);
reqStream.Close();
}
}
} /*HttpWebResponse获取服务器数据**************************************************************/
res = req.GetResponse() as HttpWebResponse;
using (Stream resStream = res.GetResponseStream())
{
using (StreamReader resStreamReader = new StreamReader(resStream, Encoding.GetEncoding(httpConfig.encoding)))
{
response = resStreamReader.ReadToEnd();
}
}
}
catch (WebException e)
{
HttpWebResponse exceptionRes = e.Response as HttpWebResponse;
errString = "#Status-line\n";
string format = "protocolVersion:{0}\tstatusCode:{1}\tstatusDescription:{2}\n";
errString += string.Format(format, exceptionRes.ProtocolVersion, Convert.ToInt32(exceptionRes.StatusCode), exceptionRes.StatusDescription); errString += "#Header\n";
format = "num[{0}]:({1}:{2})\n";
for (int i = 0; i < exceptionRes.Headers.Count; i++)
{
errString += string.Format(format, i, exceptionRes.Headers.Keys[i], exceptionRes.Headers[i]);
} errString += "#Body\n";
using (Stream resStream = exceptionRes.GetResponseStream())
{
using (StreamReader resStreamReader = new StreamReader(resStream, Encoding.GetEncoding(httpConfig.encoding)))
{
errString += resStreamReader.ReadToEnd() + "\n";
resStreamReader.Close();
resStream.Close();
}
}
errString += "#end\n"; exceptionRes.Close();
}
catch (Exception e)
{
errString = e.ToString();
}
finally
{
if (res!= null)
{
res.Close();
res = null;
} if (req != null)
{
req.Abort();
req = null;
}
} return response;
}
}
HttpWebRequest,HttpWebResponse 使用的更多相关文章
- HttpWebRequest,HttpWebResponse的用法和用途
1.用途:HettpWebRequest,HettpWebResponse用途和webServers的作用差不多,都是得到一个页面传过来的值.HttpWebRequest 2.用法:--------- ...
- C#获取网页内容 (WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)
获取网页数据有很多种方式.在这里主要讲述通过WebClient.WebBrowser和HttpWebRequest/HttpWebResponse三种方式获取网页内容. 这里获取的是包括网页的所有信息 ...
- C#网页采集数据的几种方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)
一.通过WebClient获取网页内容 这是一种很简单的获取方式,当然,其它的获取方法也很简单.在这里首先要说明的是,如果为了实际项目的效率考虑,需要考虑在函数中分配一个内存区域.大概写法如下 //M ...
- 【转】C# HttpWebRequest\HttpWebResponse\WebClient发送请求解析json数据
http://blog.csdn.net/kingcruel/article/details/44036871 版权声明:本文为博主原创文章,未经博主允许不得转载. ================= ...
- MSDN中HttpWebRequest/HttpWebResponse用法
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://home.cnblogs.com/u/weiweiboqi/ ...
- HttpWebRequest,HttpWebResponse C# 代码调用webservice,参数为xml
先上调用代码 public static string PostMoths(string url, string Json) { System.Net.HttpWebRequest request; ...
- HttpWebRequest 和HttpWebResponse总结
1. 总结 总结2 3. Code using System; using System.Collections.Generic; using System.Linq; using System.Te ...
- C#中HttpWebRequest与HttpWebResponse的使用方法
关键字:C# HttpWebRequest HttpWebResponse HTTP GET POST 请求 这个类是专门为HTTP的GET和POST请求写的,解决了编码,证书,自动带Cookie等问 ...
- 【转】C#中HttpWebRequest的用法详解
本文实例讲述了C#中HttpWebRequest的用法.分享给大家供大家参考.具体如下: HttpWebRequest类主要利用HTTP 协议和服务器交互,通常是通过 GET 和 POST 两种方式来 ...
随机推荐
- hdu 3932 Groundhog Build Home——模拟退火
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3932 注意平均值与最远的点距离为0的情况.所以初值设成-1,这样 id 就不会乱.不过设成0也可以.注意判 ...
- BZOJ2648:SJY摆棋子
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- Mysql事件的创建和使用
1.查看事件是否开启SHOW VARIABLES LIKE 'event_scheduler'; 2.开启事件SET GLOBAL event_scheduler = ON; 3.创建事件DELIMI ...
- java继承初级
总结:重写方法,方法体内容不同. 还有子类都不能加public.它表示公共,一个程序只能有一个公共类 package com.sa; public class Ac { public void rea ...
- linux参数之max_map_count
“This file contains the maximum number of memory map areas a process may have. Memory map areas are ...
- Mongodb 副本集的节点详细操作
副本集操作 官方文档:https://docs.mongodb.com/v3.2/reference/method/js-replication/ 1 rs.add(){ _id: <int&g ...
- java 基础知识学习
1: JDK VS JRE JDK: java开发工具包,提供编译和运行环境,将java编译成字节码文件,即.class文件.JDK有三个版本: j2SE, J2EE, j2me jre: 运 ...
- java线程面试题及答案
1)2017Java面试题及答案:什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务 ...
- SQLServer SDK
https://www.cnblogs.com/Leo_wl/p/3451865.html 回到目录 SQLSERVER一些公用DLL的作用解释 如果你的SQLSERVER安装在C盘的话,下面的路径就 ...
- leetcode429
这道题目是属于树的层次遍历,使用两层的队列非空判断. class Solution { public: vector<vector<int>> levelOrder(Node* ...