一个上好的C# http/https类
直接Copy拿去用吧:
新的 tls 协议需要新的.net版本, tls 至少更新到.net4吧,尽量用最新的.net! 不然出错了就折腾...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel.Security;
using System.Net;
using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions; namespace Lzp.Service
{ /// <summary>
/// 有关HTTP/HTTPS请求的辅助类 lzpong
/// 默认 UTF-8 编码
/// </summary>
public class HTTPS
{
public HTTPS()
{
//spt = SecurityProtocolType.Tls;
requestEncoding = Encoding.GetEncoding("UTF-8");
requestUserAgent = DefaultUserAgent;
}
/// <summary>
/// SecurityProtocolType
/// 如果https出现"基础连接..."或"ssl/tls..."错误,更改此属性; 也可能需要升级 .net 已支持更新的安全协议
/// 不指定,使之自动协商/适应, 避免指定的版本与服务器不一样反而连不上
/// </summary>
//public static SecurityProtocolType spt { get; set; }
//设置编码 默认编码是UTF-8
public static Encoding requestEncoding { get; set; }
//设置编码
public static void SetEncoding(string endcode) { requestEncoding = Encoding.GetEncoding(endcode); } private static string requestUserAgent = DefaultUserAgent;
private static readonly string DefaultUserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36";
//设置浏览器版本
public static void SetUserAgent(string userAgent = null) { if (!String.IsNullOrWhiteSpace(userAgent))requestUserAgent = userAgent; else requestUserAgent = DefaultUserAgent; }
/// <summary>
/// 创建GET方式的HTTP/HTTPS请求
/// </summary>
/// <param name="url">请求的URL</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 CreateGet(string url, int? timeout = null, string userAgent = null, CookieCollection cookies = null)
{
return Create(url, null, "GET", requestEncoding, timeout, cookies);
}
/// <summary>
/// 创建POST方式的HTTP/HTTPS请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="datas">随同请求POST的数据</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="headers">随同HTTP请求发送的headers信息,如Cookie等</param>
/// <returns></returns>
public static HttpWebResponse CreatePost(string url, string datas= null, int? timeout = null, string headers = null)
{
return Create(url, datas, "POST", requestEncoding, timeout, headers);
}
/// <summary>
/// 创建HTTP/HTTPS请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="datas">随同请求POST的参数名称及参数值字典</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="headers">随同HTTP请求发送的headers信息,如Cookie等</param>
/// <param name="AllowAutoRedirect">请求应自动跟随 Internet 资源的重定向响应,则为 true,否则为 false。默认值为 true。</param>
/// <returns></returns>
public static HttpWebResponse Create(string url, string datas=null, string method = "GET", Encoding requestEncoding = null, int? timeout = null, string headers= null, bool AllowAutoRedirect=true)
{
if (string.IsNullOrEmpty(url))
throw new ArgumentNullException("url"); if (requestEncoding == null)
requestEncoding=Encoding.GetEncoding("UTF-8"); HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
//ServicePointManager.SecurityProtocol = spt; //不指定,使之自动协商/适应, 避免指定的版本与服务器不一样反而连不上
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
request = WebRequest.Create(url) as HttpWebRequest; request.Method = method;
request.UserAgent = requestUserAgent;
request.AllowAutoRedirect = AllowAutoRedirect; if (timeout.HasValue)
request.Timeout = timeout.Value; if (!string.IsNullOrWhiteSpace(headers))
{
string[] arr1 = headers.Split(new string[]{ "\r\n" },StringSplitOptions.RemoveEmptyEntries);
foreach(string s in arr1)
{
string[] arr2=s.Split(new string[]{ ": " }, StringSplitOptions.RemoveEmptyEntries);
if (arr2[0] == "Referer")
request.Referer = arr2[1];
else if (arr2[0] == "User-Agent")
request.UserAgent = arr2[1];
else if (arr2[0] == "Accept")
request.Accept = arr2[1];
else if (arr2[0] == "Range")
{
string[] arr3 = arr2[1].Split('-');
long f = long.Parse(arr3[0]);
long t = 0;
if(arr3.Length>1)
t=long.Parse(arr3[1]);
if (t < f)
request.AddRange(f, t);
else
request.AddRange(f);
}
else
request.Headers.Add(arr2[0], arr2[1]);
}
}
//如果需要POST数据
if (method == "POST")
{
request.ContentType = "application/x-www-form-urlencoded";
if (!String.IsNullOrWhiteSpace(datas))
{
byte[] data = requestEncoding.GetBytes(datas);
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; //总是接受
}
/// <summary>
/// GET 方法请求 获取文本内容
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="headers">随同HTTP请求发送的headers信息,如Cookie等</param>
///
public static string Get(string url,string heads=null,string encoding=null)
{
HttpWebResponse rq = HTTP.Create("GET", url, null, null, null, heads);
Stream rs = rq.GetResponseStream();
int bt;
MemoryStream mm = new MemoryStream(128);
while ((bt = rs.ReadByte()) > -1)
{
mm.WriteByte((byte)bt);
}
string data = Encoding.UTF8.GetString(mm.GetBuffer());//默认 utf8 编码
if (rq.ContentType.IndexOf("html") > -1) //网页内容
{
int n = data.IndexOf("content-type");
if (n > 0)
{//
n = data.IndexOf("charset", n);
if (n > 0) //去网页内部指明的编码
{
int m = data.IndexOf("\"", n + 1);
n = data.IndexOf("=", n) + 1;
string c = data.Substring(n, m - n).Trim();
data = Encoding.GetEncoding(c).GetString(mm.GetBuffer());
}
}
}
else if (!string.IsNullOrWhiteSpace(rq.CharacterSet) && rq.ContentType.IndexOf(';') > 0) //非网页
{
data = Encoding.GetEncoding(rq.CharacterSet).GetString(mm.GetBuffer());
}
return data.Replace("\0", "");//要去掉末尾的'\0'
}
}
}
当然,有从网上搜罗的, 但是也是自己改装优化过的,so 还是我的咯
转载应注明http://home.cnblogs.com/u/lzpong/
一个上好的C# http/https类的更多相关文章
- Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...
- 用CIL写程序:定义一个叫“慕容小匹夫”的类
前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...
- 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能
编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...
- 一个好用的PHP验证码类
分享一个好用的php验证码类,包括调用示例. 说明: 如果不适用指定的字体,那么就用imagestring()函数,如果需要遇到指定的字体,就要用到imagettftext()函数.字体的位置在C盘下 ...
- 一个java的DES加解密类转换成C#
原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //i ...
- qt之窗口换肤(一个qss的坑:当类属性发现变化时需要重置qss,使用rcc资源文件)
1.相关文章 Qt 资源系统qt的moc,uic,rcc命令的使用 2.概要 毕业两年了,一直使用的是qt界面库来开发程序,使用过vs08.10.13等开发工具,并安装了qt的插件,最近在做客户 ...
- c++中在一个类中定义另一个只有带参数构造函数的类的对象
c++中在一个类中定义另一个只有带参数构造函数的类的对象,编译通不过 #include<iostream> using namespace std; class A { public: ...
- 实现一个简单的http请求工具类
OC自带的http请求用起来不直观,asihttprequest库又太大了,依赖也多,下面实现一个简单的http请求工具类 四个文件源码大致如下,还有优化空间 MYHttpRequest.h(类定义, ...
- MFC如何生成一个可串行化的类
一.MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程. (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构 ...
随机推荐
- 全局变量 HInstance 到底是在什么时候赋值的?
在学习 资源文件 和 钩子函数 时, 经常用到当前模块句柄(HInstance)这个全局变量. 今天特别想知道, 它到底是在什么时候给赋值的. 输入 HInstance; "Ctrl+鼠标& ...
- tomcat发布脚本
#!/bin/bash #发布相关目录Tomcat_log='/home/CodePub/tomcatlog'dev_package='/home/CodePub/package'old_packag ...
- jQuery插件开发(溢出滚动)
声明:此程序仅针对手机端,简单的封装一个插件,意在记载插件的开发过程,如有错误及不足之处,还望即时指出. 移动开发的时候,我们经常会遇到滑动事件,众所周知手机端滑动主要依靠touch事件.最近接连遇到 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 一些比较实用的css片段
新看了一个帖子,里面好多实用的css代码块,可拿出来当做功能库.先附上该文地址http://segmentfault.com/a/1190000002773955 里面的内容很多我挑了几个经过我验证的 ...
- @Autowired
1. Spring框架中进行注入式,使用@Autowired. @Autowired可以对成员变量.方法和构造函数进行标注,来完成自动装配的工作,这里必须明确:@Autowired是根据类型进行自动装 ...
- 关于Android中res目录strings.xml文件中的转义字符之笔录
res目录strings.xml文件中的转义字符: ------------------> 代表着一个汉字的位置: ---- ...
- C# EXCEL导入 混合列文字为空,找不到可安装的 ISAM的解决办法
C# EXCEL导入 混合列文字为空,找不到可安装的 ISAM的解决办法 使用C#导入 Excel数据到 DataTable,如果连接串中只写 Excel 8.0,则正常的字符列,数值列都没有问题,但 ...
- HTML5可视化编辑与微数据
1.HTML 5 全局 contenteditable 属性 contenteditable 属性规定是否可编辑元素的内容. <p contenteditable="true" ...
- HDU 2202 计算几何
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...