目的:工作中已经两次使用了,特此记录一下,并写好注释
    /// <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 使用的更多相关文章

  1. HttpWebRequest,HttpWebResponse的用法和用途

    1.用途:HettpWebRequest,HettpWebResponse用途和webServers的作用差不多,都是得到一个页面传过来的值.HttpWebRequest 2.用法:--------- ...

  2. C#获取网页内容 (WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)

    获取网页数据有很多种方式.在这里主要讲述通过WebClient.WebBrowser和HttpWebRequest/HttpWebResponse三种方式获取网页内容. 这里获取的是包括网页的所有信息 ...

  3. C#网页采集数据的几种方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)

    一.通过WebClient获取网页内容 这是一种很简单的获取方式,当然,其它的获取方法也很简单.在这里首先要说明的是,如果为了实际项目的效率考虑,需要考虑在函数中分配一个内存区域.大概写法如下 //M ...

  4. 【转】C# HttpWebRequest\HttpWebResponse\WebClient发送请求解析json数据

    http://blog.csdn.net/kingcruel/article/details/44036871 版权声明:本文为博主原创文章,未经博主允许不得转载. ================= ...

  5. MSDN中HttpWebRequest/HttpWebResponse用法

    HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://home.cnblogs.com/u/weiweiboqi/ ...

  6. HttpWebRequest,HttpWebResponse C# 代码调用webservice,参数为xml

    先上调用代码 public static string PostMoths(string url, string Json) { System.Net.HttpWebRequest request; ...

  7. HttpWebRequest 和HttpWebResponse总结

    1. 总结 总结2 3. Code using System; using System.Collections.Generic; using System.Linq; using System.Te ...

  8. C#中HttpWebRequest与HttpWebResponse的使用方法

    关键字:C# HttpWebRequest HttpWebResponse HTTP GET POST 请求 这个类是专门为HTTP的GET和POST请求写的,解决了编码,证书,自动带Cookie等问 ...

  9. 【转】C#中HttpWebRequest的用法详解

    本文实例讲述了C#中HttpWebRequest的用法.分享给大家供大家参考.具体如下: HttpWebRequest类主要利用HTTP 协议和服务器交互,通常是通过 GET 和 POST 两种方式来 ...

随机推荐

  1. DirectX 读书笔记(14) Cube mapping之SkyBox[转]

    http://blog.csdn.net/i_dovelemon/article/details/40481681 作者:i_dovelemon 来源:CSDN 日期:2014 / 10 / 26 主 ...

  2. 学习动态性能表(7)--v$process

    学习动态性能表 第七篇--V$PROCESS  2007.5.30 本视图包含当前系统oracle运行的所有进程信息.常被用于将oracle或服务进程的操作系统进程ID与数据库session之间建立联 ...

  3. 最终还是选择了markdownpad2

    markdownpad2使用 最终 哈哈,最后还是选择了markdownpad2,经过探索才知道这个玩意多么好用. 点击,下载. 碰到的问题 1.win10出现HTML无法渲染得对话框 结果是,官网有 ...

  4. BZOJ3489:A simple rmq problem

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  5. hl7 v2.X 版本中RSP_K23消息的构造

    RSP_K23消息有MSH, MSA, ERR, QAK, QPD, PID几个segment,其中ERR,PID为可选. 1. 当MSA有err时,ERR段填充出错的详细信息. 2. 当MSA为AA ...

  6. Azure SLB + httpd + ILB + HAProxy + Atlas + MySQL

    为了测试一个环境,需要在Azure上搭建高可用的LAMP架构.但要求MySQL的中间件Atlas采用主备的模式.在数据中心一般采用Keepalive+VIP的模式,通过浮动地址对外提供服务. 但在云环 ...

  7. Java基础--HashCode

    如果一个类的对象要用做hashMap的key,那么一定要注意覆盖该类的equals和hashCode方法. equals()是基类Object的方法,用于判断对象是否有相同地址及是否为同一对象 pub ...

  8. AngularJS:Bootstrap

    ylbtech-AngularJS:Bootstrap 1.返回顶部 1. AngularJS Bootstrap AngularJS 的首选样式表是 Twitter Bootstrap, Twitt ...

  9. Ubuntu bash不记录history方法

    很多都是用: unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG export HISTFILE=/dev/null export HIS ...

  10. 基于windows平台的命令行软件安装工具Chocolatey的安装

    本文介绍Chocolatey的安装和使用 Chocolatey 这是基于.NET Framework 4以上的windows安装软件的命令行工具 安装 第一步,打开你的powershell.exe,使 ...