public class RequestHelper
{
#region post 请求
public static string HttpPost(string url, object data, Dictionary<string, string> headerDic = null, string contentType = "application/json")
{
return Request(url, data, "POST", headerDic, contentType);
}
public static T HttpPost<T>(string url, object data, Dictionary<string, string> headerDic = null, string contentType = "application/json")
{
return SerializeHelper.Deserialize<T>(HttpPost(url, data, headerDic, contentType));
}
#endregion
#region get请求
public static T HttpGet<T>(string url, Dictionary<string, string> urlParameters = null, Dictionary<string, string> headerDic = null, string contentType = "application/json")
{
return SerializeHelper.Deserialize<T>(HttpGet(url, urlParameters, headerDic, contentType));
}
public static string HttpGet(string url, Dictionary<string, string> urlParameters = null, Dictionary<string, string> headerDic = null, string contentType = "application/json")
{
return Request(BuildQuery(url, urlParameters), null, "Get", headerDic, contentType);
}
#endregion
#region 辅助方法
public static string Request(string url, object data, string method, Dictionary<string, string> headerDic, string contentType)
{
HttpWebRequest request = null;
HttpWebResponse response = null;
try
{
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
//忽略证书认证错误处理的函数
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
// 这里设置了协议类型。
//.net4.5及以上
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
//.net4.5及以下
// ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
ServicePointManager.CheckCertificateRevocationList = true;
ServicePointManager.DefaultConnectionLimit = 100;
ServicePointManager.Expect100Continue = false;
}
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = method;
request.ContentType = contentType;
//request.ContentLength = Encoding.UTF8.GetByteCount(paramData);
//增加下面两个属性即可
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.AllowAutoRedirect = true;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
request.Accept = "*/*";
AddHeaderInfo(request, headerDic);
if (data != null)
{
string paramData = string.Empty;
if (data.GetType() == typeof(String))
{
paramData = Convert.ToString(data);
}
else
{
paramData = SerializeHelper.ToJson(data);
}
using (Stream requestStream = request.GetRequestStream())
{
using (StreamWriter swrite = new StreamWriter(requestStream))
{
swrite.Write(paramData);
}
}
}
using (response = (HttpWebResponse)request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader sread = new StreamReader(responseStream))
{
return sread.ReadToEnd();
}
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (request != null)
{
request.Abort();
}
if (response != null)
{
response.Close();
}
}
}
/// <summary>
/// 添加请求头信息
/// </summary>
/// <param name="request"></param>
/// <param name="headerDic"></param>
public static void AddHeaderInfo(HttpWebRequest request, Dictionary<string, string> headerDic)
{
if (headerDic != null)
{
foreach (var item in headerDic)
{
request.Headers.Add(item.Key, item.Value);
}
}
}
/// <summary>
/// 组装请求参数
/// </summary>
/// <param name="parameters">Key-Value形式请求参数字典</param>
/// <returns>URL编码后的请求数据</returns>
public static string BuildQuery(string url, IDictionary<string, string> parameters)
{
StringBuilder postData = new StringBuilder(url);
if (parameters != null)
{
bool hasParam = false;
IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
if (parameters.Count > 0)
{
postData.Append("?");
}
while (dem.MoveNext())
{
if (hasParam)
{
postData.Append("&");
}
postData.Append(dem.Current.Key);
postData.Append("=");
postData.Append(HttpUtility.UrlEncode(dem.Current.Value, Encoding.UTF8));
hasParam = true;
}
}
return postData.ToString();
}
/// <summary>
/// 获取客户端IP地址
/// </summary>
/// <returns></returns>
public static string GetIP()
{
string result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.UserHostAddress;
}
if (string.IsNullOrEmpty(result))
{
return "0.0.0.0";
}
return result;
#endregion
}
}