一个上好的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++类或结构 ...
随机推荐
- iOS路径沙盒文件管理(转载)
iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文 ...
- java常用设计模式
一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂. 后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精髓所在,我 ...
- 使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言
在VisualStudio2010中新建网站JPushAndroid.添加引用json帮助类库Newtonsoft.Json.dll. 在web.config增加appkey和mastersecret ...
- 关于3DSMAX中opensubdiv细分功能的笔记
说到建模和细分,估计用过3dsmax的同学就会心有余悸,每次添加"涡轮平滑"或者"网格平滑"之前,都会下意识的进行保存,没有为啥,就是因为太容易使软件挂掉了. ...
- Java 程序员必须掌握的 Linux 命令(转:导师Jencks)
1.查找文件 find / -name filename.txt根据名称查找/目录下的filename.txt文件. find . -name "*.xml"递归查找所有的xml文 ...
- 16-1-27---JDBC复习(01)
JDBC数据库连接学习 用jdbc连接数据库 1.加载驱动 Class.forName(""); 用注册的方式会使内存中存在两个对象,而用上 ...
- Android Studio Lambda Config
lambda虽然不能让我们应用性能更加优良,但是在代码提高整洁,方便阅读上,还是不错的选择.目前android studio对lambda的原生支持并不是很友好,可以使用第三方配置实现完美支持.配置如 ...
- Access restriction: The type 'FileURLConnection' is not API
遇到这种报错,解决方案如下: 报错原因是访问限制报错 工具栏中Project>preferences>java-Compiler>Errors/Warnings>把右侧的[De ...
- XML的简介及其与HTML的区别及联系
XML: Extensible Markup Language(可扩展标记语言) HTML:HyperText Markup Language(超文本标记语言) 两者都是由万维网联盟(W3C)推出的S ...
- xpath tutorial
http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html http://www.w3schools.com/xpath/defaul ...