You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
532 lines
19 KiB
532 lines
19 KiB
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Net.Security;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using System.Text;
|
|
|
|
namespace NFine.Code
|
|
{
|
|
public class HttpMethods
|
|
{
|
|
#region POST
|
|
/// <summary>
|
|
/// HTTP POST方式请求数据
|
|
/// </summary>
|
|
/// <param name="url">URL.</param>
|
|
/// <param name="param">POST的数据</param>
|
|
/// <returns></returns>
|
|
public static string HttpPost(string url, string param = null)
|
|
{
|
|
HttpWebRequest request;
|
|
|
|
//如果是发送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";
|
|
request.Accept = "*/*";
|
|
request.Timeout = 15000;
|
|
request.AllowAutoRedirect = false;
|
|
|
|
|
|
|
|
StreamWriter requestStream = null;
|
|
WebResponse response = null;
|
|
string responseStr = null;
|
|
|
|
try
|
|
{
|
|
requestStream = new StreamWriter(request.GetRequestStream());
|
|
requestStream.Write(param);
|
|
requestStream.Close();
|
|
|
|
response = request.GetResponse();
|
|
if (response != null)
|
|
{
|
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
|
responseStr = reader.ReadToEnd();
|
|
reader.Close();
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
request = null;
|
|
requestStream = null;
|
|
response = null;
|
|
}
|
|
|
|
return responseStr;
|
|
}
|
|
|
|
|
|
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
|
|
{
|
|
return true; //总是接受
|
|
}
|
|
public static string BuildRequest(string strUrl, Dictionary<string, string> dicPara, string fileName)
|
|
{
|
|
string contentType = "image/jpeg";
|
|
//待请求参数数组
|
|
FileStream Pic = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
|
byte[] PicByte = new byte[Pic.Length];
|
|
Pic.Read(PicByte, 0, PicByte.Length);
|
|
int lengthFile = PicByte.Length;
|
|
|
|
//构造请求地址
|
|
|
|
//设置HttpWebRequest基本信息
|
|
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl);
|
|
//设置请求方式:get、post
|
|
request.Method = "POST";
|
|
//设置boundaryValue
|
|
string boundaryValue = DateTime.Now.Ticks.ToString("x");
|
|
string boundary = "--" + boundaryValue;
|
|
request.ContentType = "\r\nmultipart/form-data; boundary=" + boundaryValue;
|
|
//设置KeepAlive
|
|
request.KeepAlive = true;
|
|
//设置请求数据,拼接成字符串
|
|
StringBuilder sbHtml = new StringBuilder();
|
|
foreach (KeyValuePair<string, string> key in dicPara)
|
|
{
|
|
sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"" + key.Key + "\"\r\n\r\n" + key.Value + "\r\n");
|
|
}
|
|
sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"pic\"; filename=\"");
|
|
sbHtml.Append(fileName);
|
|
sbHtml.Append("\"\r\nContent-Type: " + contentType + "\r\n\r\n");
|
|
string postHeader = sbHtml.ToString();
|
|
//将请求数据字符串类型根据编码格式转换成字节流
|
|
Encoding code = Encoding.GetEncoding("UTF-8");
|
|
byte[] postHeaderBytes = code.GetBytes(postHeader);
|
|
byte[] boundayBytes = Encoding.ASCII.GetBytes("\r\n" + boundary + "--\r\n");
|
|
//设置长度
|
|
long length = postHeaderBytes.Length + lengthFile + boundayBytes.Length;
|
|
request.ContentLength = length;
|
|
|
|
//请求远程HTTP
|
|
Stream requestStream = request.GetRequestStream();
|
|
Stream myStream = null;
|
|
try
|
|
{
|
|
//发送数据请求服务器
|
|
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
|
|
requestStream.Write(PicByte, 0, lengthFile);
|
|
requestStream.Write(boundayBytes, 0, boundayBytes.Length);
|
|
HttpWebResponse HttpWResp = (HttpWebResponse)request.GetResponse();
|
|
myStream = HttpWResp.GetResponseStream();
|
|
}
|
|
catch (WebException e)
|
|
{
|
|
//LogResult(e.Message);
|
|
return "";
|
|
}
|
|
finally
|
|
{
|
|
if (requestStream != null)
|
|
{
|
|
requestStream.Close();
|
|
}
|
|
}
|
|
|
|
//读取处理结果
|
|
StreamReader reader = new StreamReader(myStream, code);
|
|
StringBuilder responseData = new StringBuilder();
|
|
|
|
String line;
|
|
while ((line = reader.ReadLine()) != null)
|
|
{
|
|
responseData.Append(line);
|
|
}
|
|
myStream.Close();
|
|
Pic.Close();
|
|
|
|
return responseData.ToString();
|
|
}
|
|
#endregion
|
|
|
|
#region Put
|
|
/// <summary>
|
|
/// HTTP Put方式请求数据.
|
|
/// </summary>
|
|
/// <param name="url">URL.</param>
|
|
/// <returns></returns>
|
|
public static string HttpPut(string url, string param = null)
|
|
{
|
|
HttpWebRequest request;
|
|
|
|
//如果是发送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 = "PUT";
|
|
request.ContentType = "application/x-www-form-urlencoded";
|
|
request.Accept = "*/*";
|
|
request.Timeout = 15000;
|
|
request.AllowAutoRedirect = false;
|
|
|
|
StreamWriter requestStream = null;
|
|
WebResponse response = null;
|
|
string responseStr = null;
|
|
|
|
try
|
|
{
|
|
requestStream = new StreamWriter(request.GetRequestStream());
|
|
requestStream.Write(param);
|
|
requestStream.Close();
|
|
|
|
response = request.GetResponse();
|
|
if (response != null)
|
|
{
|
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
|
responseStr = reader.ReadToEnd();
|
|
reader.Close();
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
request = null;
|
|
requestStream = null;
|
|
response = null;
|
|
}
|
|
|
|
return responseStr;
|
|
}
|
|
#endregion
|
|
|
|
#region Delete
|
|
/// <summary>
|
|
/// HTTP Delete方式请求数据.
|
|
/// </summary>
|
|
/// <param name="url">URL.</param>
|
|
/// <returns></returns>
|
|
public static string HttpDelete(string url, string param = null)
|
|
{
|
|
HttpWebRequest request;
|
|
|
|
//如果是发送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 = "Delete";
|
|
request.ContentType = "application/x-www-form-urlencoded";
|
|
request.Accept = "*/*";
|
|
request.Timeout = 15000;
|
|
request.AllowAutoRedirect = false;
|
|
|
|
StreamWriter requestStream = null;
|
|
WebResponse response = null;
|
|
string responseStr = null;
|
|
|
|
try
|
|
{
|
|
requestStream = new StreamWriter(request.GetRequestStream());
|
|
requestStream.Write(param);
|
|
requestStream.Close();
|
|
|
|
response = request.GetResponse();
|
|
if (response != null)
|
|
{
|
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
|
responseStr = reader.ReadToEnd();
|
|
reader.Close();
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
throw;
|
|
}
|
|
return responseStr;
|
|
}
|
|
#endregion
|
|
|
|
#region Get
|
|
/// <summary>
|
|
/// HTTP GET方式请求数据.
|
|
/// </summary>
|
|
/// <param name="url">URL.</param>
|
|
/// <returns></returns>
|
|
public static string HttpGet(string url, Hashtable headht = null)
|
|
{
|
|
HttpWebRequest request;
|
|
|
|
//如果是发送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 = "GET";
|
|
//request.ContentType = "application/x-www-form-urlencoded";
|
|
request.Accept = "*/*";
|
|
request.Timeout = 15000;
|
|
request.AllowAutoRedirect = false;
|
|
WebResponse response = null;
|
|
string responseStr = null;
|
|
if (headht != null)
|
|
{
|
|
foreach (DictionaryEntry item in headht)
|
|
{
|
|
request.Headers.Add(item.Key.ToString(), item.Value.ToString());
|
|
}
|
|
}
|
|
|
|
try
|
|
{
|
|
response = request.GetResponse();
|
|
|
|
if (response != null)
|
|
{
|
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
|
|
responseStr = reader.ReadToEnd();
|
|
reader.Close();
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
throw;
|
|
}
|
|
return responseStr;
|
|
}
|
|
public static string HttpGet(string url, Encoding encodeing, Hashtable headht = null)
|
|
{
|
|
HttpWebRequest request;
|
|
|
|
//如果是发送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 = "GET";
|
|
//request.ContentType = "application/x-www-form-urlencoded";
|
|
request.Accept = "*/*";
|
|
request.Timeout = 15000;
|
|
request.AllowAutoRedirect = false;
|
|
WebResponse response = null;
|
|
string responseStr = null;
|
|
if (headht != null)
|
|
{
|
|
foreach (DictionaryEntry item in headht)
|
|
{
|
|
request.Headers.Add(item.Key.ToString(), item.Value.ToString());
|
|
}
|
|
}
|
|
|
|
try
|
|
{
|
|
response = request.GetResponse();
|
|
|
|
if (response != null)
|
|
{
|
|
StreamReader reader = new StreamReader(response.GetResponseStream(), encodeing);
|
|
responseStr = reader.ReadToEnd();
|
|
reader.Close();
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
throw;
|
|
}
|
|
return responseStr;
|
|
}
|
|
#endregion
|
|
|
|
#region Post With Pic
|
|
private string HttpPost(string url, IDictionary<object, object> param, string filePath)
|
|
{
|
|
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
|
|
byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
|
|
|
|
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
|
|
wr.ContentType = "multipart/form-data; boundary=" + boundary;
|
|
wr.Method = "POST";
|
|
wr.KeepAlive = true;
|
|
wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
|
|
|
|
Stream rs = wr.GetRequestStream();
|
|
string responseStr = null;
|
|
|
|
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
|
|
foreach (string key in param.Keys)
|
|
{
|
|
rs.Write(boundarybytes, 0, boundarybytes.Length);
|
|
string formitem = string.Format(formdataTemplate, key, param[key]);
|
|
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
|
|
rs.Write(formitembytes, 0, formitembytes.Length);
|
|
}
|
|
rs.Write(boundarybytes, 0, boundarybytes.Length);
|
|
|
|
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
|
|
string header = string.Format(headerTemplate, "pic", filePath, "text/plain");
|
|
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
|
|
rs.Write(headerbytes, 0, headerbytes.Length);
|
|
|
|
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
|
|
byte[] buffer = new byte[4096];
|
|
int bytesRead = 0;
|
|
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
|
|
{
|
|
rs.Write(buffer, 0, bytesRead);
|
|
}
|
|
fileStream.Close();
|
|
|
|
byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
|
|
rs.Write(trailer, 0, trailer.Length);
|
|
rs.Close();
|
|
|
|
WebResponse wresp = null;
|
|
try
|
|
{
|
|
wresp = wr.GetResponse();
|
|
Stream stream2 = wresp.GetResponseStream();
|
|
StreamReader reader2 = new StreamReader(stream2);
|
|
responseStr = reader2.ReadToEnd();
|
|
//logger.Debug(string.Format("File uploaded, server response is: {0}", responseStr));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//logger.Error("Error uploading file", ex);
|
|
if (wresp != null)
|
|
{
|
|
wresp.Close();
|
|
wresp = null;
|
|
}
|
|
throw;
|
|
}
|
|
return responseStr;
|
|
}
|
|
#endregion
|
|
|
|
#region Post With Pic
|
|
/// <summary>
|
|
/// HTTP POST方式请求数据(带图片)
|
|
/// </summary>
|
|
/// <param name="url">URL</param>
|
|
/// <param name="param">POST的数据</param>
|
|
/// <param name="fileByte">图片</param>
|
|
/// <returns></returns>
|
|
public static string HttpPost(string url, IDictionary<object, object> param, byte[] fileByte)
|
|
{
|
|
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
|
|
byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
|
|
|
|
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
|
|
wr.ContentType = "multipart/form-data; boundary=" + boundary;
|
|
wr.Method = "POST";
|
|
wr.KeepAlive = true;
|
|
wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
|
|
|
|
Stream rs = wr.GetRequestStream();
|
|
string responseStr = null;
|
|
|
|
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
|
|
foreach (string key in param.Keys)
|
|
{
|
|
rs.Write(boundarybytes, 0, boundarybytes.Length);
|
|
string formitem = string.Format(formdataTemplate, key, param[key]);
|
|
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
|
|
rs.Write(formitembytes, 0, formitembytes.Length);
|
|
}
|
|
rs.Write(boundarybytes, 0, boundarybytes.Length);
|
|
|
|
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
|
|
string header = string.Format(headerTemplate, "pic", fileByte, "text/plain");//image/jpeg
|
|
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
|
|
rs.Write(headerbytes, 0, headerbytes.Length);
|
|
|
|
rs.Write(fileByte, 0, fileByte.Length);
|
|
|
|
byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
|
|
rs.Write(trailer, 0, trailer.Length);
|
|
rs.Close();
|
|
|
|
WebResponse wresp = null;
|
|
try
|
|
{
|
|
wresp = wr.GetResponse();
|
|
Stream stream2 = wresp.GetResponseStream();
|
|
StreamReader reader2 = new StreamReader(stream2);
|
|
responseStr = reader2.ReadToEnd();
|
|
// logger.Error(string.Format("File uploaded, server response is: {0}", responseStr));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//logger.Error("Error uploading file", ex);
|
|
if (wresp != null)
|
|
{
|
|
wresp.Close();
|
|
wresp = null;
|
|
}
|
|
throw;
|
|
}
|
|
return responseStr;
|
|
}
|
|
#endregion
|
|
|
|
#region HttpsClient
|
|
/// <summary>
|
|
/// 创建HttpClient
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static HttpClient CreateHttpClient(string url)
|
|
{
|
|
HttpClient httpclient;
|
|
//如果是发送HTTPS请求
|
|
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
|
|
httpclient = new HttpClient();
|
|
}
|
|
else
|
|
{
|
|
httpclient = new HttpClient();
|
|
}
|
|
return httpclient;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|