WebRequestHelper
老是浪费时间写这个类,干脆记录在博客里:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks; namespace XiaoDao.Core
{
public class WebRequestHelper
{
private const string userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"; #region HttpPost
public static string HttpPost(WebRequestOption options)
{
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(options.Url);
myRequest.Method = "POST";
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
if (options.ContentType != null)
{
myRequest.ContentType = options.ContentType;
}
else
{
//myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentType = "application/json";
}
myRequest.UserAgent = userAgent; byte[] payload = null;
string formData = GetFormData(options.Paras);
if (!string.IsNullOrEmpty(formData))
{
payload = Encoding.UTF8.GetBytes(formData);
myRequest.ContentLength = payload.Length;
}
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
using (Stream mySream = myRequest.GetRequestStream())
{
if (payload != null && payload.Length > 0)
{
mySream.Write(payload, 0, payload.Length);
}
} try
{
using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse())
{
using (StreamReader myReader = new StreamReader(myResponse.GetResponseStream(), options.MyEncoding))
{
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
} public static async Task<string> HttpPostAsync(WebRequestOption options)
{
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(options.Url);
myRequest.Method = "POST";
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
if (options.ContentType != null)
{
myRequest.ContentType = options.ContentType;
}
else
{
myRequest.ContentType = "application/x-www-form-urlencoded";
//myRequest.ContentType = "application/json";
}
myRequest.UserAgent = userAgent; byte[] payload = null;
string formData = GetFormData(options.Paras);
if (!string.IsNullOrEmpty(formData))
{
payload = Encoding.UTF8.GetBytes(formData);
myRequest.ContentLength = payload.Length;
}
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
using (Stream mySream = myRequest.GetRequestStream())
{
if (payload != null && payload.Length > 0)
{
mySream.Write(payload, 0, payload.Length);
}
} try
{
using (HttpWebResponse myResponse = (HttpWebResponse)await myRequest.GetResponseAsync())
{
using (StreamReader myReader = new StreamReader(myResponse.GetResponseStream(), options.MyEncoding))
{
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
} public static async Task<string> HttpPostJsonAsync(WebRequestOption options)
{
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(options.Url);
myRequest.Method = "POST";
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
myRequest.ContentType = "application/json";
myRequest.UserAgent = userAgent; byte[] payload = null;
string jsonData = options.Paras.ToString();
if (!string.IsNullOrEmpty(jsonData))
{
payload = Encoding.UTF8.GetBytes(jsonData);
myRequest.ContentLength = payload.Length;
}
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
using (Stream mySream = myRequest.GetRequestStream())
{
if (payload != null && payload.Length > 0)
{
mySream.Write(payload, 0, payload.Length);
}
} try
{
using (HttpWebResponse myResponse = (HttpWebResponse)await myRequest.GetResponseAsync())
{
using (StreamReader myReader = new StreamReader(myResponse.GetResponseStream(), options.MyEncoding))
{
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
catch(WebException ex)
{
var res = (HttpWebResponse)ex.Response;
using (StreamReader myReader = new StreamReader(res.GetResponseStream(), options.MyEncoding))
{
string responseText = myReader.ReadToEnd();
return responseText;
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
}
#endregion #region HttpGet
public static string HttpGet(WebRequestOption options)
{
string formData = GetFormData(options.Paras);
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
string url = string.IsNullOrEmpty(formData) ? options.Url : options.Url + "?" + formData;
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = "GET";
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
myRequest.UserAgent = userAgent;
if (url.StartsWith("https://"))
{
//myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentType = "application/json";
}
myRequest.Accept = "*/*";
myRequest.KeepAlive = true;
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
try
{
using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse())
{
using (Stream sResponse = myResponse.GetResponseStream())
{
using (StreamReader myReader = new StreamReader(sResponse, options.MyEncoding))
{
options.Status = myResponse.StatusCode;
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
} public static async Task<string> HttpGetAsync(WebRequestOption options)
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); string formData = GetFormData(options.Paras);
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
string url = string.IsNullOrEmpty(formData) ? options.Url : options.Url + "?" + formData;
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = "GET";
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
myRequest.UserAgent = userAgent;
if (url.StartsWith("https://"))
{
//myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentType = "application/json";
}
myRequest.Accept = "*/*";
myRequest.KeepAlive = true;
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
try
{
using (HttpWebResponse myResponse = (HttpWebResponse)await myRequest.GetResponseAsync())
{
using (Stream sResponse = myResponse.GetResponseStream())
{
using (StreamReader myReader = new StreamReader(sResponse, options.MyEncoding))
{
options.Status = myResponse.StatusCode;
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
}
#endregion public static async Task<string> ExecQueryAsync(string url)
{
using (HttpClient httpClient = new HttpClient())
{
HttpResponseMessage response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string resultStr = await response.Content.ReadAsStringAsync();
return resultStr;
}
} private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
} #region 帮助方法
public static string GetFormData(object paras)
{
StringBuilder formData = new StringBuilder();
if (paras != null)
{
Type t = paras.GetType();
if (t.Name.Contains("Dictionary"))
{
foreach (KeyValuePair<String, String> kvp in paras as Dictionary<string, string>)
{
if (formData.ToString() == "")
{
formData.Append(kvp.Key + "=" + kvp.Value);
}
else
{
formData.Append("&" + kvp.Key + "=" + kvp.Value);
}
}
}
else if (t.Name == "String")
{
formData.Append(paras.ToString());
}
else
{
foreach (PropertyInfo pi in t.GetProperties())
{
var jsonProperty = pi.CustomAttributes.SingleOrDefault(p => p.AttributeType.FullName == "Newtonsoft.Json.JsonPropertyAttribute");
string name = jsonProperty == null ? pi.Name : jsonProperty.ConstructorArguments[0].Value.ToString();
object val = pi.GetValue(paras, null); if (formData.ToString() == "")
{
formData.Append(name + "=" + val);
}
else
{
formData.Append("&" + name + "=" + val);
}
}
}
}
return formData.ToString();
}
#endregion
}
public class WebRequestOption
{
public string Url { get; set; }
/// <summary>
/// 可以是匿名对象, 可以是字典
/// </summary>
public object Paras { get; set; }
public Dictionary<string, string> Headers = new Dictionary<string, string>();
public CookieContainer CC { get; set; }
public Encoding MyEncoding { get; set; }
public WebProxy MyProxy { get; set; }
public HttpStatusCode Status { get; set; }
public Exception MyException { get; set; }
public SecurityProtocolType SecurityProtocol { get; set; }
public string ContentType { get; set; } /// <summary>
/// 没有任何关于SecurityProtocold的默认设置
/// </summary>
public WebRequestOption()
{
if (this.MyEncoding == null)
{
this.MyEncoding = Encoding.UTF8;
}
}
/// <summary>
/// htts协议将默认设置为Tls1.0
/// </summary>
/// <param name="url"></param>
/// <param name="paras"></param>
public WebRequestOption(string url, object paras = null)
{
this.Url = url;
if (paras != null)
{
this.Paras = paras;
}
if (this.MyEncoding == null)
{
this.MyEncoding = Encoding.UTF8;
}
if (this.Url.StartsWith("https") && this.SecurityProtocol == SecurityProtocolType.SystemDefault)
{
this.SecurityProtocol = SecurityProtocolType.Tls12;
}
}
}
}
哈哈,这下爽了
WebRequestHelper的更多相关文章
- 请求WebApi的几种方式
目前所了解的请求WebAPI的方式有通过后台访问api 和通过js 直接访问api接口 首先介绍下通过后台访问api的方法,可以使用HttpClient的方式也可以使用WebRequest的方式 1. ...
- C# v3微信 access token 过期处理的问题
//记录access token 申请时的时间 private static DateTime GetAccessToken_Time; /// <summary> /// 过期时间为72 ...
- Magicodes.WeiChat——版本发布历史
购买地址:https://item.taobao.com/item.htm?id=520205558575 您可以在新标签页打开此图,以查看原始图片. Magicodes.WeiChat为湖南心莱信息 ...
- c#后台调用API
前两周赶上项目第一个版本上线,着实忙了一把,毕竟只有两个人负责.如今已完结,总算喘了一口气,现在任务就是写API.测API,许久之前写过JS前台调用 项目API,也写过后台调用开放的手机号归属地查询, ...
- C#使用Http的Post方式请求webservice
webservice是以前比较流行的跨系统.跨语言.跨平台的数据交互技术.最近工作中调用Java作为服务端开放的webser,我是通过VS205生成webservice工具类的方式进行接口调用的.用这 ...
- WebApi的调用-2.后台调用
httpClient调用方式 namespace SOA.Common { //httpClient调用WebApi public class HttpClientHelper { public st ...
- C#获取用户基本信息一(关注了公众号的用户)
一.获取Code 假设我们需要网页授权的页面的地址为redirect_uri 需要获取Code的话我们第一步是跳转到授权地址,我们第一步便是获取拼接授权地址 --采用snsapi_base方式 pu ...
- C#获取网页信息核心方法(入门一)
目录:信息采集入门系列目录 下面记录的是我自己整理的C#请求页面核心类,主要有如下几个方法 1.HttpWebRequest Get请求获得页面html 2.HttpWebRequest Post请求 ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架2
本篇目的:封装一些抽象类 1::封装日志相关类 2:封装一个Service操作类 3:封装缓存操作类 4:封装其他一些常用Helper 1.1在Framework项目里面建立好相关操作类文件夹,以便于 ...
随机推荐
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Fork And Join框架初探
首先,关于Fork And Join框架的入门资料我觉得最好的是: Java线程(十一):Fork/Join-Java并行计算框架 本文参考了这篇文章 Fork/Join框架的核心类是ForkJoin ...
- 网站开发进阶(四十三)html中,路径前加“/” 与不加“/”的区别
网站开发进阶(四十三)html中,路径前加"/" 与不加"/"的区别 前言 <script src="js/downloadify.js&quo ...
- 手把手教你轻松实现listview上拉加载
上篇讲了如何简单快速的的实现listview下拉刷新,那么本篇将讲解如何简单快速的实现上拉加载更多.其实,如果你已经理解了下拉刷新的实现过程,那么实现上拉加载更多将变得轻松起来,原理完全一致,甚至实现 ...
- CoordinatorLayout 自定义Behavior并不难,由简到难手把手带你撸三款!
先来看看最终的效果~~ 本文同步至博主的私人博客wing的地方酒馆 嗯..一个是头像上移的 另一个是模仿UC浏览器的. (PД`q.)你不是说!有三款的吗,怎么只有两款!!!! 不要急嘛... 说了从 ...
- Java进阶(一)Java内存解析
栈.堆.常量池等虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,简单讲解Java内存分配方面的知识. 首先我们先来讲解一下内存中的各个区域. stack(栈) ...
- Andoird Crash的跟踪方法,使用腾讯Bugly来捕捉一些疑难杂症,让我们APP稳定上线
Andoird Crash的跟踪方法,使用腾讯Bugly来捕捉一些疑难杂症,让我们APP稳定上线 我们在开发中常常会注意到一些Crash,这正是很头疼的,而且Crash会带来很多意想不到的状态,很恶心 ...
- protobuf代码生成
windows : 1,两个文件:proto.exe, protobuf-java-2.4.1.jar 2,建立一个工程TestPb,在下面建立一个proto文件件,用来存放[.proto]文件 3, ...
- libcoro:在c++中支持coroutine
起因 在第一个版本的libtnet开发完成之后,我一直在思考如何让异步方式的网络编程更加简单. 虽然libtnet通过c++ shared_ptr以及function等技术很大程度上面解决了异步代码编 ...
- Dynamics CRM2013 Server2012R2下IFD部署遇到There is already a listener on IP endpoint的解决方法
接上一篇继续Server2012R2的问题,因为自己先在R2上部署的IFD报错后上网查了很多资料,但毕竟R2是新出的CRM2013也是新出的,网上基本还没有相关的问题反馈,基本都是2012以前的系统版 ...