You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

323 lines
13 KiB
Plaintext

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.IO;
using BP.DA;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace BP.WF
{
public class HttpWebResponseUtility
{
private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
/// <summary>
/// 创建GET方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息如果不需要身份验证可以为空</param>
/// <returns></returns>
public HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies)
{
if (DataType.IsNullOrEmpty(url))
throw new ArgumentNullException("url");
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//由于远程方已关闭传输流,身份验证失败 加这行
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
request.Method = "GET";
request.UserAgent = DefaultUserAgent;
if (!DataType.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
return request.GetResponse() as HttpWebResponse;
}
/// <summary>
/// 创建POST方式的HTTP请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息如果不需要身份验证可以为空</param>
/// <returns></returns>
public HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies)
{
if (DataType.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
//由于远程方已关闭传输流,身份验证失败 加这行
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
if (!DataType.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//如果需要POST数据
if (!(parameters == null || parameters.Count == 0))
{
StringBuilder buffer = new StringBuilder();
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
else
{
buffer.AppendFormat("{0}={1}", key, parameters[key]);
}
i++;
}
byte[] data = requestEncoding.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
return request.GetResponse() as HttpWebResponse;
}
/// <summary>
/// 创建POST方式的HTTP请求 ContentType json
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="JsonParameters">随同请求POST的参数名称及参数值字典json</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息如果不需要身份验证可以为空</param>
/// <returns></returns>
public HttpWebResponse CreatePostHttpResponse(string url, string JsonParameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies)
{
if (DataType.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.ContentType = "application/json";
if (!DataType.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//如果需要POST数据
if (!DataType.IsNullOrEmpty(JsonParameters))
{
byte[] data = requestEncoding.GetBytes(JsonParameters);
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
return request.GetResponse() as HttpWebResponse;
}
/// <summary>
/// 创建POST方式的HTTP请求 (用于微信自动推送)
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
/// <param name="timeout">请求的超时时间</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
/// <param name="cookies">随同HTTP请求发送的Cookie信息如果不需要身份验证可以为空</param>
/// <returns></returns>
public HttpWebResponse WXCreateGetHttpResponse(string url, StringBuilder parameters,
int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies)
{
if (DataType.IsNullOrEmpty(url))
throw new Exception("err@url不能为空");
if (requestEncoding == null)
throw new Exception("err@requestEncoding不能为空.");
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
if (DataType.IsNullOrEmpty(userAgent)==false)
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
///增加参数的地方.
if (parameters != null)
{
StringBuilder sb = parameters;
byte[] requestBytes = Encoding.UTF8.GetBytes(sb.ToString());
request.ContentLength = requestBytes.Length;
Stream requeStream = request.GetRequestStream();
requeStream.Write(requestBytes, 0, requestBytes.Length);
requeStream.Close();
}
return request.GetResponse() as HttpWebResponse;
}
private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //总是接受
}
/// <summary>
/// 根据Url获取返回内容
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public string HttpResponseGet(string url)
{
HttpWebResponse response = this.CreateGetHttpResponse(url, 600000, null, null);
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string str = reader.ReadToEnd();
reader.Dispose();
reader.Close();
if (response != null)
response.Close();
return str;
}
/// <summary>
/// 随同请求POST的参数名称及参数值字典
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="parameters">参数集合</param>
/// <returns>响应返回结果</returns>
public string HttpResponsePost(string url, IDictionary<string, string> parameters)
{
Encoding encoding = Encoding.GetEncoding("utf-8");
HttpWebResponse response = this.CreatePostHttpResponse(url, parameters, 10000, null, encoding, null);
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string str = reader.ReadToEnd();
reader.Dispose();
reader.Close();
if (response != null)
response.Close();
return str;
}
/// <summary>
/// 随同请求POST的参数名称及参数值字典
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="parameters">参数集合</param>
/// <returns>响应返回结果</returns>
public string HttpResponsePost_Json(string url, string parameters)
{
Encoding encoding = Encoding.GetEncoding("utf-8");
HttpWebResponse response = this.CreatePostHttpResponse(url, parameters, 10000, null, encoding, null);
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string str = reader.ReadToEnd();
reader.Dispose();
reader.Close();
if (response != null)
response.Close();
return str;
}
}
}