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初级教程理论知识(第九章多媒体编程)
多媒体概念 文字.图片.音频.视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像素 ...
- IOS中 浅谈iOS中MVVM的架构设计与团队协作
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 1051. Pop Sequence (25)
题目如下: Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N ...
- 海量数据挖掘MMDS week7: 局部敏感哈希LSH(进阶)
http://blog.csdn.net/pipisorry/article/details/49686913 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- Linux信号实践(4) --可靠信号
Sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct si ...
- #include <iostream>与#include <iostream.h>的区别
在新的C++标准中,生成新头文件的方法仅仅是将现有C++头文件名中的 .h 去掉.例如,<iostream.h> 变成了<iostream> ,<complex. ...
- Java模式之模板方法模式
当我们遇到的业务逻辑具有大致相同的方式的时候,我们也许就该将这个业务逻辑抽象出来,采用模板方法,来进行封装我们的代码,提高代码的重用性,以及可维护性.下面是我的一个复习用的案例: 第一步:我们需要一个 ...
- (四十一)数据持久化的NSCoding实现 -实现普通对象的存取
NSCoding可以用与存取一般的类对象,需要类成为NSCoding的代理,并且实现编码和解码方法. 假设类Person有name和age两个属性,应该这样设置类: .h文件: #import < ...
- Windows下比较简单的获取网页源码的方法
第一个方法是使用MFC里面的 <afxinet.h> CString GetHttpFileData(CString strUrl) { CInternetSession Session( ...
- LeetCode之“链表”:在O(1)时间删除链表节点
下边讨论暂不包括尾节点. 一般来说,我们要删除链表中的一个节点是需要知道其上一节点的.但我们真的需要吗? 其实我们可以将待删节点的下一节点的值和指向的下一节点赋予待删节点,然后删除待删节点的下一节点. ...