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.

1106 lines
50 KiB
C#

9 months ago
using System;
using System.Collections;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace POSV.HttpRequest
{
/// <summary>
/// Http连接操作帮助类
/// </summary>
public partial class HttpHelper
{
#region 支持基于任务方式
#region Get
/// <summary>
/// Http异步请求Get方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> GetTask(string url, string contentType = "", WebHeaderCollection header = null) {
return _TaskRq(url, HttpVerb.Get, contentType, header);
}
/// <summary>
/// Http异步请求Get方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> GetTask(string url, object parameters, string contentType = "", WebHeaderCollection header = null) {
return _TaskRq(url, parameters, HttpVerb.Get, contentType, header);
}
#endregion Get
#region Head
/// <summary>
/// Http异步请求Head方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="header"></param>
public static Task<HttpResult> HeadTask(string url, WebHeaderCollection header = null) {
return _TaskRq(url, HttpVerb.Head, string.Empty, header);
}
#endregion Head
#region Post
/// <summary>
/// Http异步请求Post方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> PostTask(string url, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
return _TaskRq(url, HttpVerb.Post, contentType, header);
}
/// <summary>
/// Http异步请求Post方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> PostTask(string url, object parameters, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
return _TaskRq(url, parameters, HttpVerb.Post, contentType, header);
}
#endregion Post
#region Put
/// <summary>
/// Http异步请求Put方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> PutTask(string url, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
return _TaskRq(url, HttpVerb.Put, contentType, header);
}
/// <summary>
/// Http异步请求Put方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> PutTask(string url, object parameters, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
return _TaskRq(url, parameters, HttpVerb.Put, contentType, header);
}
#endregion Put
#region Delete
/// <summary>
/// Http异步请求Delete方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> DeleteTask(string url, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
return _TaskRq(url, HttpVerb.Delete, contentType, header);
}
/// <summary>
/// Http异步请求Delete方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> DeleteTask(string url, object parameters, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
return _TaskRq(url, parameters, HttpVerb.Delete, contentType, header);
}
#endregion Delete
#region Patch
/// <summary>
/// Http异步请求Patch方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> PatchTask(string url, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
return _TaskRq(url, HttpVerb.Patch, contentType, header);
}
/// <summary>
/// Http异步请求Patch方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> PatchTask(string url, object parameters, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
return _TaskRq(url, parameters, HttpVerb.Patch, contentType, header);
}
#endregion Patch
#region Body
/// <summary>
/// Http异步请求发送 Body
/// </summary>
/// <param name="url">url地址</param>
/// <param name="body">Body</param>
/// <param name="method">请求方法</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
/// <returns>Task</returns>
public static Task<HttpResult> BodyTask(string url, Stream body, HttpVerb method = HttpVerb.Get, string contentType = "text/json", WebHeaderCollection header = null) {
var cts = new TaskCompletionSource<HttpResult>();
Request(new HttpParam { URL = url, Method = method, ContentType = contentType, Header = header }, body, (result) =>
{
if (result.IsFaulted)
cts.SetException(result.Exception);
else if (result.IsCanceled)
cts.SetCanceled();
else if (result.IsCompleted)
cts.SetResult(result);
});
return cts.Task;
}
#endregion Body
#region Upload
/// <summary>
/// 异步上传文件
/// </summary>
/// <param name="url">url地址</param>
/// <param name="files">文件信息</param>
/// <param name="parameters">请求参数</param>
/// <param name="method">请求方法</param>
/// <param name="contentType">contentType</param>
/// <param name="header">header</param>
/// <returns>Task</returns>
public static Task<HttpResult> UploadTask(string url, NamedFileStream[] files, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
var cts = new TaskCompletionSource<HttpResult>();
Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files, (result) =>
{
if (result.IsFaulted)
cts.SetException(result.Exception);
else if (result.IsCanceled)
cts.SetCanceled();
else if (result.IsCompleted)
cts.SetResult(result);
});
return cts.Task;
}
#endregion Upload
#region _TaskRq 提供一组供给 Get Head Post 等模板函数
private static Task<HttpResult> _TaskRq(string url, HttpVerb method, string contentType, WebHeaderCollection header) {
var cts = new TaskCompletionSource<HttpResult>();
Request(new HttpParam { URL = url, Method = method, ContentType = contentType, Header = header }, (result) =>
{
if (result.IsFaulted)
cts.SetException(result.Exception);
else if (result.IsCanceled)
cts.SetCanceled();
else if (result.IsCompleted)
cts.SetResult(result);
});
return cts.Task;
}
private static Task<HttpResult> _TaskRq(string url, object parameters, HttpVerb method, string contentType, WebHeaderCollection header) {
var cts = new TaskCompletionSource<HttpResult>();
Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, (result) =>
{
if (result.IsFaulted)
cts.SetException(result.Exception);
else if (result.IsCanceled)
cts.SetCanceled();
else if (result.IsCompleted)
cts.SetResult(result);
});
return cts.Task;
}
#endregion _AsyncRq 提供一组供给 Get Head Post 等模板函数
#endregion
#region 支持异步方式
#region Get
/// <summary>
/// Http异步请求Get方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Get(string url, Action<string> callback, string contentType = "", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Get, contentType, header);
}
/// <summary>
/// Http异步请求Get方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Get(string url, object parameters, Action<string> callback, string contentType = "", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Get, contentType, header);
}
/// <summary>
/// Http异步请求Get方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Get(string url, Action<byte[]> callback, string contentType = "", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Get, contentType, header);
}
/// <summary>
/// Http异步请求Get方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Get(string url, object parameters, Action<byte[]> callback, string contentType = "", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Get, contentType, header);
}
/// <summary>
/// Http异步请求Get方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Get(string url, Action<HttpResult> callback, string contentType = "", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Get, contentType, header);
}
/// <summary>
/// Http异步请求Get方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Get(string url, object parameters, Action<HttpResult> callback, string contentType = "", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Get, contentType, header);
}
#endregion Get
#region Head
/// <summary>
/// Http异步请求Head方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="header"></param>
public static void Head(string url, Action<HttpResult> callback, WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Head, string.Empty, header);
}
#endregion Head
#region Post
/// <summary>
/// Http异步请求Post方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Post(string url, object parameters, Action<string> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Post, contentType, header);
}
/// <summary>
/// Http异步请求Post方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Post(string url, object parameters, Action<byte[]> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Post, contentType, header);
}
/// <summary>
/// Http异步请求Post方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Post(string url, object parameters, Action<HttpResult> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Post, contentType, header);
}
#endregion Post
#region Put
/// <summary>
/// Http异步请求Put方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Put(string url, Action<string> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Put, contentType, header);
}
/// <summary>
/// Http异步请求Put方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Put(string url, object parameters, Action<string> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Put, contentType, header);
}
/// <summary>
/// Http异步请求Put方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Put(string url, Action<byte[]> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Put, contentType, header);
}
/// <summary>
/// Http异步请求Put方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Put(string url, object parameters, Action<byte[]> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Put, contentType, header);
}
/// <summary>
/// Http异步请求Put方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Put(string url, Action<HttpResult> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Put, contentType, header);
}
/// <summary>
/// Http异步请求Put方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Put(string url, object parameters, Action<HttpResult> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Put, contentType, header);
}
#endregion Put
#region Delete
/// <summary>
/// Http异步请求Delete方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Delete(string url, Action<string> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Delete, contentType, header);
}
/// <summary>
/// Http异步请求Delete方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Delete(string url, object parameters, Action<string> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Delete, contentType, header);
}
/// <summary>
/// Http异步请求Delete方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Delete(string url, Action<byte[]> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Delete, contentType, header);
}
/// <summary>
/// Http异步请求Delete方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Delete(string url, object parameters, Action<byte[]> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Delete, contentType, header);
}
/// <summary>
/// Http异步请求Delete方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Delete(string url, Action<HttpResult> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Delete, contentType, header);
}
/// <summary>
/// Http异步请求Delete方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Delete(string url, object parameters, Action<HttpResult> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Delete, contentType, header);
}
#endregion Delete
#region Patch
/// <summary>
/// Http异步请求Patch方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Patch(string url, Action<string> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Patch, contentType, header);
}
/// <summary>
/// Http异步请求Patch方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Patch(string url, object parameters, Action<string> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Patch, contentType, header);
}
/// <summary>
/// Http异步请求Patch方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Patch(string url, Action<byte[]> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Patch, contentType, header);
}
/// <summary>
/// Http异步请求Patch方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Patch(string url, object parameters, Action<byte[]> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Patch, contentType, header);
}
/// <summary>
/// Http异步请求Patch方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Patch(string url, Action<HttpResult> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, callback, HttpVerb.Patch, contentType, header);
}
/// <summary>
/// Http异步请求Patch方法
/// </summary>
/// <param name="url">url地址</param>
/// <param name="parameters">请求参数</param>
/// <param name="callback">回调函数</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Patch(string url, object parameters, Action<HttpResult> callback, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
_AsyncRq(url, parameters, callback, HttpVerb.Patch, contentType, header);
}
#endregion Patch
#region Body
/// <summary>
/// Http异步请求发送 Body
/// </summary>
/// <param name="url">url地址</param>
/// <param name="body">Body</param>
/// <param name="callback">回调函数</param>
/// <param name="method">请求方法</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Body(string url, Stream body, Action<HttpResult> callback, HttpVerb method = HttpVerb.Get, string contentType = "text/json", WebHeaderCollection header = null) {
Request(new HttpParam { URL = url, Method = method, ContentType = contentType, Header = header }, body, callback);
}
/// <summary>
/// Http异步请求发送 Body
/// </summary>
/// <param name="url">url地址</param>
/// <param name="body">Body</param>
/// <param name="callback">回调函数</param>
/// <param name="method">请求方法</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Body(string url, Stream body, Action<string> callback, HttpVerb method = HttpVerb.Get, string contentType = "text/json", WebHeaderCollection header = null) {
Request(new HttpParam { URL = url, Method = method, ContentType = contentType, Header = header }, body, StreamToStringCallback(callback));
}
/// <summary>
/// Http异步请求发送 Body
/// </summary>
/// <param name="url">url地址</param>
/// <param name="body">Body</param>
/// <param name="callback">回调函数</param>
/// <param name="method">请求方法</param>
/// <param name="contentType">contentType</param>
/// <param name="header"></param>
public static void Body(string url, Stream body, Action<byte[]> callback, HttpVerb method = HttpVerb.Get, string contentType = "text/json", WebHeaderCollection header = null) {
Request(new HttpParam { URL = url, Method = method, ContentType = contentType, Header = header }, body, StreamToBytesCallback(callback));
}
#endregion Body
#region Upload
/// <summary>
/// 异步上传文件
/// </summary>
/// <param name="url">url地址</param>
/// <param name="files">文件信息</param>
/// <param name="callback">回调函数</param>
/// <param name="parameters">请求参数</param>
/// <param name="method">请求方法</param>
/// <param name="contentType">contentType</param>
/// <param name="header">header</param>
public static void Upload(string url, NamedFileStream[] files, Action<HttpResult> callback, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files, callback);
}
/// <summary>
/// 异步上传文件
/// </summary>
/// <param name="url">url地址</param>
/// <param name="files">文件信息</param>
/// <param name="callback">回调函数</param>
/// <param name="parameters">请求参数</param>
/// <param name="method">请求方法</param>
/// <param name="contentType">contentType</param>
/// <param name="header">header</param>
public static void Upload(string url, NamedFileStream[] files, Action<string> callback, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files, StreamToStringCallback(callback));
}
/// <summary>
/// 异步上传文件
/// </summary>
/// <param name="url">url地址</param>
/// <param name="files">文件信息</param>
/// <param name="callback">回调函数</param>
/// <param name="parameters">请求参数</param>
/// <param name="method">请求方法</param>
/// <param name="contentType">contentType</param>
/// <param name="header">header</param>
public static void Upload(string url, NamedFileStream[] files, Action<byte[]> callback, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) {
Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files, StreamToBytesCallback(callback));
}
#endregion Upload
#region _AsyncRq 提供一组供给 Get Head Post 等模板函数
private static void _AsyncRq(string url, Action<string> callback, HttpVerb method, string contentType, WebHeaderCollection header) {
Request(new HttpParam { URL = url, Method = method, ContentType = contentType, Header = header }, StreamToStringCallback(callback));
}
private static void _AsyncRq(string url, object parameters, Action<string> callback, HttpVerb method, string contentType, WebHeaderCollection header) {
Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, StreamToStringCallback(callback));
}
private static void _AsyncRq(string url, Action<byte[]> callback, HttpVerb method, string contentType, WebHeaderCollection header) {
Request(new HttpParam { URL = url, Method = method, ContentType = contentType, Header = header }, StreamToBytesCallback(callback));
}
private static void _AsyncRq(string url, object parameters, Action<byte[]> callback, HttpVerb method, string contentType, WebHeaderCollection header) {
Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, StreamToBytesCallback(callback));
}
private static void _AsyncRq(string url, Action<HttpResult> callback, HttpVerb method, string contentType, WebHeaderCollection header) {
Request(new HttpParam { URL = url, Method = method, ContentType = contentType, Header = header }, callback);
}
private static void _AsyncRq(string url, object parameters, Action<HttpResult> callback, HttpVerb method, string contentType, WebHeaderCollection header) {
Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, callback);
}
#endregion _AsyncRq 提供一组供给 Get Head Post 等模板函数
#endregion
#region Request
/// <summary>
/// Http异步请求发送
/// </summary>
/// <param name="httpParam">请求参数</param>
/// <param name="files">文件上传的信息</param>
/// <param name="callback">返回请求响应结果回调</param>
/// <param name="userState">状态</param>
public static void Request(HttpParam httpParam, NamedFileStream[] files, Action<HttpResult, object> callback, object userState) {
Request(httpParam, files, (result) => callback(result, userState));
}
/// <summary>
/// Http异步请求发送
/// </summary>
/// <param name="httpParam">请求参数</param>
/// <param name="files">文件上传的信息</param>
/// <param name="callback">返回请求响应结果回调</param>
public static void Request(HttpParam httpParam, NamedFileStream[] files, Action<HttpResult> callback) {
if (httpParam == null) {
throw new ArgumentException("httpParam not null");
}
if (httpParam.Method != HttpVerb.Post && httpParam.Method != HttpVerb.Put) {
throw new ArgumentException("Request method must be POST or PUT");
}
if (string.IsNullOrWhiteSpace(httpParam.URL)) {
throw new ArgumentException("url not null");
}
//使用回调的方法进行证书验证。
if (httpParam.RemoteCertificateValidationCallback != null)
ServicePointManager.ServerCertificateValidationCallback = httpParam.RemoteCertificateValidationCallback;
Encoding encoding = DefaultEncoding;
if (httpParam.Encoding != null)
encoding = httpParam.Encoding;
if (files.Length == 0)
throw new ArgumentException("files is empty");
HttpWebRequest request = null;
//设置分界线
string boundary = RandomString(12);
try {
request = (HttpWebRequest)HttpWebRequest.Create(new Uri(httpParam.URL));
SetRequest(request, httpParam);
request.ContentType = "multipart/form-data; boundary=" + boundary;
//开始异步请求
request.BeginGetRequestStream(new AsyncCallback((callbackResult) =>
{
HttpWebRequest _request = (HttpWebRequest)callbackResult.AsyncState;
var requestStream = _request.EndGetRequestStream(callbackResult);
//转化网络流对象进行直接射入,省内存
using (StreamWriter writer = new StreamWriter(requestStream, encoding)) {
try {
IDictionary postbody = SerializeQuery(httpParam.Parameters);
string newLine = "\r\n";
//处理form-data
if (postbody != null) {
foreach (string key in postbody.Keys) {
if (postbody[key] != null) {
writer.Write("--" + boundary + newLine);
writer.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}", key, newLine);
writer.Write(postbody[key] + newLine);
writer.Flush();
}
}
}
//处理文件流
foreach (var file in files) {
writer.Write("--" + boundary + newLine);
writer.Write(
"Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}",
file.Name,
file.FileName,
newLine
);
writer.Write("Content-Type: application/octet-stream" + newLine + newLine);
writer.Flush();
//复制文件流到Body
CopyStream(file.Stream, requestStream);
writer.Write(newLine);
writer.Write("--" + boundary + newLine);
writer.Flush();
}
} catch (Exception ex) {
requestStream.Dispose();
ProcessFailCallback(callback, ex);
return;
} finally {
//使用完后释放
foreach (var file in files)
if (file.Stream != null)
file.Stream.Dispose();
}
}
//异步接收响应,并且设置一个超时时间
IAsyncResult asyncResult = _request.BeginGetResponse(null, _request);
asyncResult.FromAsync((ia, isTimeout) =>
{
if (isTimeout) {
ProcessFailCallback(callback, new TimeoutException("Connection Timeout"));
} else {
ProcessCallback(ia, callback);
}
}, httpParam.Timeout);
}), request);
} catch (WebException exception) {
//遇到异常时候再次释放一次,防止内存泄漏
foreach (var file in files)
if (file.Stream != null)
file.Stream.Dispose();
if (request != null)
request.Abort();
ProcessFailCallback(callback, exception);
}
}
/// <summary>
/// Http异步请求发送
/// </summary>
/// <param name="httpParam">请求参数</param>
/// <param name="callback">返回请求响应结果回调</param>
/// <param name="userState">状态</param>
public static void Request(HttpParam httpParam, Action<HttpResult, object> callback, object userState) {
Request(httpParam, (result) => callback(result, userState));
}
/// <summary>
/// Http异步请求发送
/// </summary>
/// <param name="httpParam">请求参数</param>
/// <param name="callback">返回请求响应结果回调</param>
public static void Request(HttpParam httpParam, Action<HttpResult> callback) {
if (httpParam == null) {
throw new ArgumentException("httpParam not null");
}
if (string.IsNullOrWhiteSpace(httpParam.URL)) {
throw new ArgumentException("url not null");
}
//使用回调的方法进行证书验证。
if (httpParam.RemoteCertificateValidationCallback != null)
ServicePointManager.ServerCertificateValidationCallback = httpParam.RemoteCertificateValidationCallback;
HttpWebRequest request = null;
Encoding encoding = DefaultEncoding;
if (httpParam.Encoding != null)
encoding = httpParam.Encoding;
try {
if (httpParam.Method == HttpVerb.Delete || httpParam.Method == HttpVerb.Post || httpParam.Method == HttpVerb.Put || httpParam.Method == HttpVerb.Patch) {
request = (HttpWebRequest)HttpWebRequest.Create(new Uri(httpParam.URL));
SetRequest(request, httpParam);
//开始异步请求
request.BeginGetRequestStream(new AsyncCallback((callbackResult) =>
{
HttpWebRequest _request = (HttpWebRequest)callbackResult.AsyncState;
var requestStream = _request.EndGetRequestStream(callbackResult);
//转化网络流对象进行直接射入,省内存
using (StreamWriter writer = new StreamWriter(requestStream, encoding)) {
try {
string postbody = SerializeQueryString(httpParam.Parameters);
writer.Write(postbody);
writer.Flush();
} catch (Exception ex) {
writer.Dispose();
ProcessFailCallback(callback, ex);
return;
}
}
//异步接收响应,并且设置一个超时时间
IAsyncResult asyncResult = _request.BeginGetResponse(null, _request);
asyncResult.FromAsync((ia, isTimeout) =>
{
if (isTimeout) {
ProcessFailCallback(callback, new TimeoutException("Connection Timeout"));
} else {
ProcessCallback(ia, callback);
}
}, httpParam.Timeout);
}), request);
} else {
//处理URL参数
if (httpParam.Parameters != null) {
UriBuilder b = new UriBuilder(httpParam.URL);
if (!string.IsNullOrWhiteSpace(b.Query)) {
b.Query = b.Query.Substring(1) + "&" + SerializeQueryString(httpParam.Parameters);
} else {
b.Query = SerializeQueryString(httpParam.Parameters);
}
httpParam.URL = b.Uri.ToString();
}
request = (HttpWebRequest)HttpWebRequest.Create(new Uri(httpParam.URL));
SetRequest(request, httpParam);
IAsyncResult asyncResult = request.BeginGetResponse(null, request);
asyncResult.FromAsync((ia, isTimeout) =>
{
if (isTimeout) {
ProcessFailCallback(callback, new TimeoutException("Connection Timeout"));
} else {
ProcessCallback(ia, callback);
}
}, httpParam.Timeout);
}
} catch (WebException exception) {
if (request != null)
request.Abort();
ProcessFailCallback(callback, exception);
}
}
/// <summary>
/// Http异步请求发送
/// </summary>
/// <param name="httpParam">请求参数</param>
/// <param name="body">Http Body</param>
/// <param name="callback">返回请求响应结果回调</param>
/// <param name="userState">状态</param>
public static void Request(HttpParam httpParam, Stream body, Action<HttpResult, object> callback, object userState) {
Request(httpParam, body, (result) => callback(result, userState));
}
/// <summary>
/// Http异步请求发送
/// </summary>
/// <param name="httpParam">请求参数</param>
/// <param name="body">Http Body</param>
/// <param name="callback">返回请求响应结果回调</param>
public static void Request(HttpParam httpParam, Stream body, Action<HttpResult> callback) {
if (httpParam == null) {
throw new ArgumentException("httpParam not null");
}
if (string.IsNullOrWhiteSpace(httpParam.URL)) {
throw new ArgumentException("url not null");
}
if (body == null || body == Stream.Null)
throw new ArgumentException("body not null");
//使用回调的方法进行证书验证。
if (httpParam.RemoteCertificateValidationCallback != null)
ServicePointManager.ServerCertificateValidationCallback = httpParam.RemoteCertificateValidationCallback;
HttpWebRequest request = null;
try {
request = (HttpWebRequest)HttpWebRequest.Create(new Uri(httpParam.URL));
SetRequest(request, httpParam);
//开始异步请求
request.BeginGetRequestStream(new AsyncCallback((callbackResult) =>
{
HttpWebRequest _request = (HttpWebRequest)callbackResult.AsyncState;
Stream requestStream = _request.EndGetRequestStream(callbackResult);
CopyStream(body, requestStream);//写入Body数据
body.Close();
//异步接收响应,并且设置一个超时时间
IAsyncResult asyncResult = request.BeginGetResponse(null, request);
asyncResult.FromAsync((ia, isTimeout) =>
{
if (isTimeout) {
ProcessFailCallback(callback, new TimeoutException("Connection Timeout"));
} else {
ProcessCallback(ia, callback);
}
}, httpParam.Timeout);
}), request);
} catch (WebException exception) {
if (request != null)
request.Abort();
body.Close();
ProcessFailCallback(callback, exception);
}
}
#endregion Request
#region Private Methods
//回调参数转化为字节
private static Action<HttpResult> StreamToBytesCallback(Action<byte[]> callback) {
return (HttpResult result) =>
{
callback(result.ToBytesResult());
};
}
//回调参数转化为字符串
private static Action<HttpResult> StreamToStringCallback(Action<string> callback) {
return (HttpResult result) =>
{
callback(result.ToStringResult());
};
}
/// <summary>
/// 处理请求回调
/// </summary>
/// <param name="callbackResult"></param>
/// <param name="callback"></param>
private static void ProcessCallback(IAsyncResult callbackResult, Action<HttpResult> callback) {
HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
HttpWebResponse response = null;
try {
response = (HttpWebResponse)myRequest.EndGetResponse(callbackResult);
if (callback != null) {
HttpResult result = new HttpResult();
result.StatusCode = response.StatusCode;
result.StatusDescription = response.StatusDescription;
result.Header = response.Headers;
result.ContentLength = response.ContentLength;
result.ContentType = response.ContentType;
result.IsMutuallyAuthenticated = response.IsMutuallyAuthenticated;
result.IsFromCache = response.IsFromCache;
result.LastModified = response.LastModified;
result.Method = response.Method;
result.ProtocolVersion = response.ProtocolVersion;
result.Server = response.Server;
result.CharacterSet = response.CharacterSet;
result.ContentEncoding = response.ContentEncoding;
//包装相应的流同步时候因为Stream还没关闭使用完后连同HttpWebResponse一起关闭
result.Result = new WrapperResponseStream((response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
? new GZipStream(response.GetResponseStream(), CompressionMode.Decompress) : response.GetResponseStream(), response);
if (response.Cookies != null) result.CookieCollection = response.Cookies;
if (response.Headers["set-cookie"] != null) result.Cookie = response.Headers["set-cookie"];
result.IsCompleted = true;
callback(result);
} else {
response.Close();
}
} catch (WebException exception) {
if (response != null)
response.Close();
ProcessFailCallback(callback, exception);
}
}
/// <summary>
/// 处理失败的请求
/// </summary>
/// <param name="callback"></param>
/// <param name="ex"></param>
private static void ProcessFailCallback(Action<HttpResult> callback, Exception ex) {
//LogContext.GetLogger<HttpRequest>().Error(ex.Message, ex);
if (callback != null)
callback(new HttpResult { Exception = ex, IsFaulted = true, IsCanceled = ex is TimeoutException });
}
#endregion Private Methods
}
}