一个上好的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++类或结构 ...
随机推荐
- MYSQL 按照字母排序查询
select id vKey, name vValue from ib_brand order by convert(name USING gbk) COLLATE gbk_chinese_ci a ...
- Simulink Memory vs Unit Delay
Memoryブロック.Unit Delayブロック共に前回の入力値を出力しますが.動作するタイミングが異なります. ●Memoryブロック シミュレーションの各時刻(ステップ)で動作し.「1ステップ」 ...
- 历年NOIP水题泛做
快noip了就乱做一下历年的noip题目咯.. noip2014 飞扬的小鸟 其实这道题并不是很难,但是就有点难搞 听说男神错了一个小时.. 就是$f_{i,j}$表示在第$i$个位置高度为$j$的时 ...
- [转] js对象浅拷贝和深拷贝详解
本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: var Chinese = ...
- Codeforces Round #259 (Div. 2)
A. Little Pony and Crystal Mine 水题,每行D的个数为1,3.......n-2,n,n-2,.....3,1,然后打印即可 #include <iostream& ...
- BZOJ2506: calc
Description 给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值 ...
- share
一:struts2简介 (1)struts1和struts2 webwork struts2 (在struts2出来之前,有两个特别流行的框架,一个叫struts1一个是web work,那个时候st ...
- 编写base64图片文件
base64编码代替css背景图片在网站上应用是很广泛的,例如:loading gif图片,天猫加载时那只猫等等. 因为base64图片可以减少http请求,所以我们经常会把不经常改动的,独立的,尺寸 ...
- 【PostgreSQL】PostgreSQL的安装
到了新公司,新公司的数据库是使用PostgreSQL,第一次学习,第一次安装. 开始安装:
- jsp 中 有没有类似java if else语句
<c:when test=""></c:when> <c:otherwise></c:otherwise> 有if else的功能 ...