一个上好的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++类或结构 ...
随机推荐
- 安卓开发error opening trace file: No such file or directory (2)报错原因
error opening trace file: No such file or directory (2) 这个问题的出现是因为运行的测试机android系统版本和项目api不一致导致. 改成一样 ...
- 布局包含Image和Title的UIButton
UIButton中的titleEdgeInsets和imageEdgeInsets可以管理button中image和title的布局. 如果对其理解不够深入,用纯数字进行布局管理,经过不断的调试,还是 ...
- 如何解决插入Oracle数据中文为乱码问题
1.首先,Oracle查询编码:select * from v$nls_parameters;//看看是否GBK 2.如果是用Servlet或者别的,插入数据之前输出一下,看看是否乱码.比如: doP ...
- Scrum 项目4.0
队友: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...
- .NET Web开发笔记
HttpWebRequest HttpWebRequest默认关闭Cookies,给其赋初始值以打开Cookies读写 myRequest.CookieContainer = new CookieCo ...
- Building a RESTful Web Service
Reference: https://spring.io/guides/gs/rest-service/ 参照上述链接进行操作,使用gradle build. 因为total new to this. ...
- c、c++ 常用函数记录
1.void* memcpy(char*dest, char*src, size_tnum) 将第二个参数拷贝到第一个参数,最后一个是长度. 2.void *memset(void *s, int ...
- MongoDB aggregate 运用篇
基础知识 操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip:忽略结果的数量 $sort:按照给定的 ...
- Ubuntu安装Oracle SQLDeveloper
1、下载Oracle安装文件 这里我下载的是Linux RPM版本,文件名为sqldeveloper-4.0.3.16.84-1.noarch.rpm http://www.oracle.com/te ...
- fsockopen读取、发送cookie及注意事项 -代码示例
function httpPost($url, $data,$cookieStr='') { $url_array = parse_url($url); $host = $url_array['hos ...