ComplianceServer/code/DG.Core/HttpClient.cs

759 lines
32 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Unicode;
using System.Threading.Tasks;
using System.Web;
namespace DG.Core
{
public class HttpClient : IHttpClient
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger<HttpClient> _logger;
private static LogLevel _logLevel = LogLevel.Debug;
public HttpClient(IHttpClientFactory httpClientFactory,
ILogger<HttpClient> logger)
{
_httpClientFactory = httpClientFactory;
_logger = logger;
}
private static JsonSerializerOptions options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNameCaseInsensitive = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
public void ChangeLogLevel(LogLevel logLevel)
{
_logLevel = logLevel;
}
private void Log(string message)
{
_logger.Log(_logLevel, message);
}
/// <summary>
/// Post Security
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="data"></param>
/// <param name="clientid"></param>
/// <param name="accessKey"></param>
/// <param name="iv"></param>
/// <returns></returns>
public async Task<T> PostSecurityAsync<T>(string url, object data, string clientid, string accessKey, string iv)
{
try
{
var timeStamp = GetTimeStamp();
var options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNameCaseInsensitive = true
};
var param = JsonSerializer.Serialize(data, options);
var bodyJson = EncryptByAES(param, accessKey, iv);
var sign = SignData(bodyJson, accessKey);
var client = _httpClientFactory.CreateClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("clientid", clientid);
client.DefaultRequestHeaders.Add("sign", sign);
var httpData = new StringContent(bodyJson, Encoding.UTF8, "application/json");
Log($"POST 请求Url:{url}, Body:{bodyJson}");
var httpResponse = await client.PostAsync($"{url}", httpData);
var stream = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{stream}");
var response = JsonSerializer.Deserialize<T>(stream, options);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "POST 方法请求错误!");
throw;
}
}
private static string SignData(string ciphertext, string accessKey)
{
Encoding utf = new UTF8Encoding();
HMACMD5 hmac = new HMACMD5(utf.GetBytes(accessKey));
byte[] hashValue = hmac.ComputeHash(utf.GetBytes(ciphertext));
return Convert.ToBase64String(hashValue);
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="param"></param>
/// <param name="data"></param>
/// <param name="clientid"></param>
/// <param name="accessKey"></param>
/// <returns></returns>
public async Task<T> PostSecurityAsync<T>(string url, object param, object data, string clientid, string accessKey)
{
try
{
var timeStamp = GetTimeStamp();
var paramStr = JsonSerializer.Serialize(param, options);
var bodyJson = JsonSerializer.Serialize(data, options);
var content = EncyptData(paramStr, accessKey);
var sign = SignData(content, accessKey);
var client = _httpClientFactory.CreateClient();
client.Timeout = TimeSpan.FromSeconds(30);
var httpData = new StringContent(bodyJson, Encoding.UTF8, "application/json");
url = $"{url}?content={HttpUtility.UrlEncode(content)}&sign={HttpUtility.UrlEncode(sign, Encoding.UTF8)}&clientid={clientid}";
Log($"POST 请求Url:{url}, Body:{bodyJson}");
var httpResponse = await client.PostAsync(url, httpData);
var stream = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{stream}");
var response = JsonSerializer.Deserialize<T>(stream, options);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "POST 方法请求错误!");
throw;
}
}
/// <summary>
/// Post Security
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="data"></param>
/// <param name="clientid"></param>
/// <param name="accessKey"></param>
/// <param name="iv"></param>
/// <returns></returns>
public async Task<string> PostSecurityAsync(string url, object data, string clientid, string accessKey, string iv)
{
try
{
var timeStamp = GetTimeStamp();
var options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNameCaseInsensitive = true
};
var param = JsonSerializer.Serialize(data, options);
var bodyJson = EncryptByAES(param, accessKey, iv);
var sign = SignData(bodyJson, accessKey);
var client = _httpClientFactory.CreateClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("clientid", clientid);
client.DefaultRequestHeaders.Add("sign", sign);
var httpData = new StringContent(bodyJson, Encoding.UTF8, "application/json");
Log($"POST 请求Url:{url}, Body:{bodyJson}");
var httpResponse = await client.PostAsync($"{url}", httpData);
var response = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{response}");
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "POST 方法请求错误!");
throw;
}
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="param"></param>
/// <param name="data"></param>
/// <param name="clientid"></param>
/// <param name="accessKey"></param>
/// <returns></returns>
public async Task<string> PostSecurityAsync(string url, object param, object data, string clientid, string accessKey)
{
try
{
var timeStamp = GetTimeStamp();
var paramStr = JsonSerializer.Serialize(param, options);
var bodyJson = JsonSerializer.Serialize(data, options);
var content = EncyptData(paramStr, accessKey);
var sign = SignData(content, accessKey);
var client = _httpClientFactory.CreateClient();
var httpData = new StringContent(bodyJson, Encoding.UTF8, "application/json");
url = $"{url}?content={HttpUtility.UrlEncode(content)}&sign={HttpUtility.UrlEncode(sign, Encoding.UTF8)}&clientid={clientid}";
Log($"POST 请求Url:{url}, Body:{bodyJson}");
var httpResponse = await client.PostAsync(url, httpData);
var response = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{response}");
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "POST 方法请求错误!");
throw;
}
}
public async Task<T> UploadFileAsync<T>(string url, string fileName, string fullName, Dictionary<string, string>? headers = null)
{
try
{
var buffer = await File.ReadAllBytesAsync(fullName);
var client = _httpClientFactory.CreateClient();
if (headers != null)
{
foreach (var header in headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
}
ByteArrayContent fileContent = new ByteArrayContent(buffer);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file", FileName = fileName };
MultipartFormDataContent content = new MultipartFormDataContent
{
fileContent
};
Log($"UploadFile 文件上传请求Url:{url}");
var httpResponse = await client.PostAsync(url, content);
var stream = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{stream}");
var response = JsonSerializer.Deserialize<T>(stream, options);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "UploadFile 方法请求错误!");
throw;
}
}
public async Task<string> UploadFileAsync(string url, string fileName, string fullName, Dictionary<string, string>? headers = null)
{
try
{
var buffer = await File.ReadAllBytesAsync(fullName);
var client = _httpClientFactory.CreateClient();
if (headers != null)
{
foreach (var header in headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
}
ByteArrayContent fileContent = new ByteArrayContent(buffer);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file", FileName = fileName };
MultipartFormDataContent content = new MultipartFormDataContent
{
fileContent
};
Log($"UploadFile 文件上传请求Url:{url}");
var httpResponse = await client.PostAsync(url, content);
var response = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{response}");
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "UploadFile 方法请求错误!");
throw;
}
}
#region
/// <summary>
/// Post
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="data"></param>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <param name="mediaType"></param>
/// <returns></returns>
public async Task<T> PostAsync2<T>(string url, string data, string? appId = "", string? appSecret = "", string? mediaType = "application/json")
{
// _logger.LogInformation("卧槽进来了。1111");
try
{
var client = _httpClientFactory.CreateClient();
//var options = new JsonSerializerOptions
//{
// DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
// PropertyNameCaseInsensitive = true
//};
// _logger.LogInformation("卧槽,进来了。");
var bodyJson = data;
if (!string.IsNullOrEmpty(appId))
{
client.DefaultRequestHeaders.Add("appid", appId);
}
if (!string.IsNullOrEmpty(appId) && !string.IsNullOrEmpty(appSecret))
{
var timeStamp = GetTimeStamp();
var sign = CreateSign(appId, bodyJson, appSecret, timeStamp);
var authorization = $"{appId}:{sign}";
client.DefaultRequestHeaders.TryAddWithoutValidation("authorization", authorization);
client.DefaultRequestHeaders.Add("timestamps", timeStamp);
}
var httpData = new StringContent(bodyJson, Encoding.UTF8, mediaType);
_logger.LogInformation($"POST 请求Url:{url}, Body:{bodyJson}");
var httpResponse = await client.PostAsync($"{url}", httpData);
var stream = await httpResponse.Content.ReadAsStringAsync();
_logger.LogInformation($"请求结果:{stream}");
var response = JsonSerializer.Deserialize<T>(stream, options);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "POST 方法请求错误!");
throw;
}
}
/// <summary>
/// Post
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="data"></param>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <param name="mediaType"></param>
/// <returns></returns>
public async Task<T> PostAsync<T>(string url, object? data = null, string? appId = "", string? appSecret = "", string? mediaType = "application/json")
{
try
{
var client = _httpClientFactory.CreateClient();
//var options = new JsonSerializerOptions
//{
// DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
// PropertyNameCaseInsensitive = true
//};
Log("卧槽,进来了。");
var bodyJson = data != null ? Newtonsoft.Json.JsonConvert.SerializeObject(data) : "";
if (!string.IsNullOrEmpty(appId))
{
client.DefaultRequestHeaders.Add("appid", appId);
}
if (!string.IsNullOrEmpty(appId) && !string.IsNullOrEmpty(appSecret))
{
var timeStamp = GetTimeStamp();
var sign = CreateSign(appId, bodyJson, appSecret, timeStamp);
var authorization = $"{appId}:{sign}";
client.DefaultRequestHeaders.TryAddWithoutValidation("authorization", authorization);
client.DefaultRequestHeaders.Add("timestamps", timeStamp);
}
var httpData = new StringContent(bodyJson, Encoding.UTF8, mediaType);
Log($"POST 请求Url:{url}, Body:{bodyJson}");
var httpResponse = await client.PostAsync($"{url}", httpData);
var stream = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{stream}");
var response = JsonSerializer.Deserialize<T>(stream, options);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "POST 方法请求错误!");
throw;
}
}
public async Task<string> PostAsync(string url, object? data = null, string? appId = "", string? appSecret = "", string? mediaType = "application/json")
{
try
{
var client = _httpClientFactory.CreateClient();
var options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNameCaseInsensitive = true
};
var bodyJson = data != null ? JsonSerializer.Serialize(data, options) : "";
if (!string.IsNullOrEmpty(appId))
{
client.DefaultRequestHeaders.Add("appid", appId);
}
if (!string.IsNullOrEmpty(appId) && !string.IsNullOrEmpty(appSecret))
{
var timeStamp = GetTimeStamp();
var sign = CreateSign(appId, bodyJson, appSecret, timeStamp);
var authorization = $"{appId}:{sign}";
client.DefaultRequestHeaders.TryAddWithoutValidation("authorization", authorization);
client.DefaultRequestHeaders.Add("timestamps", timeStamp);
}
var httpData = new StringContent(bodyJson, Encoding.UTF8, mediaType);
Log($"POST 请求Url:{url}, Body:{bodyJson}");
var httpResponse = await client.PostAsync($"{url}", httpData);
var response = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{response}");
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "POST 方法请求错误!");
throw;
}
}
/// <summary>
/// Get
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <returns></returns>
public async Task<T> GetAsync<T>(string url, string appId = "", string appSecret = "", int timeout = 10000)
{
try
{
var client = _httpClientFactory.CreateClient();
client.Timeout = TimeSpan.FromMilliseconds(timeout);
var options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNameCaseInsensitive = true
};
if (!string.IsNullOrEmpty(appId))
{
client.DefaultRequestHeaders.Add("appid", appId);
}
if (!string.IsNullOrEmpty(appId) && !string.IsNullOrEmpty(appSecret))
{
var uri = new Uri(url);
var query = uri.Query;
var param = new Dictionary<string, object>();
if (query != null)
{
foreach (var item in query.Split('&'))
{
var sp = item.Split("=");
if (sp.Count() > 1)
{
param.Add(sp[0].Replace("?", ""), sp[1]);
}
}
}
var timeStamp = GetTimeStamp();
param = param.OrderBy(m => m.Key).ToDictionary(m => m.Key, n => n.Value);
var paramStr = JsonSerializer.Serialize(param, options);
var sign = CreateSign(appId, paramStr, appSecret, timeStamp);
var authorization = $"{appId}:{sign}";
client.DefaultRequestHeaders.TryAddWithoutValidation("authorization", authorization);
client.DefaultRequestHeaders.Add("timestamps", timeStamp);
}
Log($"GET 请求Url:{url}");
var httpResponse = await client.GetAsync($"{url}");
var stream = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{stream}");
var response = JsonSerializer.Deserialize<T>(stream, options);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "GET 方法请求错误!");
throw;
}
}
/// <summary>
/// Get
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="param"></param>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <returns></returns>
public async Task<T> GetAsync<T>(string url, Dictionary<string, object> param, string appId = "", string appSecret = "")
{
try
{
var client = _httpClientFactory.CreateClient();
client.Timeout = TimeSpan.FromSeconds(30);
var options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNameCaseInsensitive = true
};
var urlParam = string.Join("&", param.Select(m => m.Key + "=" + m.Value));
if (url.IndexOf('?') > -1)
{
url += urlParam;
}
else
{
url = url + "?" + urlParam;
}
if (!string.IsNullOrEmpty(appId))
{
client.DefaultRequestHeaders.Add("appid", appId);
}
if (!string.IsNullOrEmpty(appId) && !string.IsNullOrEmpty(appSecret))
{
var timeStamp = GetTimeStamp();
param = param.OrderBy(m => m.Key).ToDictionary(m => m.Key, n => n.Value);
var paramStr = JsonSerializer.Serialize(param, options);
var sign = CreateSign(appId, paramStr, appSecret, timeStamp);
var authorization = $"{appId}:{sign}";
client.DefaultRequestHeaders.TryAddWithoutValidation("authorization", authorization);
client.DefaultRequestHeaders.Add("timestamps", timeStamp);
}
Log($"GET 请求Url:{url}");
var httpResponse = await client.GetAsync($"{url}");
var stream = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{stream}");
var response = JsonSerializer.Deserialize<T>(stream, options);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "GET 方法请求错误!");
throw;
}
}
/// <summary>
/// Get
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <returns></returns>
public async Task<string> GetAsync(string url, string appId = "", string appSecret = "")
{
try
{
var client = _httpClientFactory.CreateClient();
client.Timeout = TimeSpan.FromSeconds(30);
var options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNameCaseInsensitive = true
};
if (!string.IsNullOrEmpty(appId) && !string.IsNullOrEmpty(appSecret))
{
var uri = new Uri(url);
var query = uri.Query;
var param = new Dictionary<string, object>();
if (query != null)
{
foreach (var item in query.Split('&'))
{
var sp = item.Split("=");
if (sp.Count() > 1)
{
param.Add(sp[0].Replace("?", ""), sp[1]);
}
}
}
var timeStamp = GetTimeStamp();
param = param.OrderBy(m => m.Key).ToDictionary(m => m.Key, n => n.Value);
var paramStr = JsonSerializer.Serialize(param, options);
var sign = CreateSign(appId, paramStr, appSecret, timeStamp);
var authorization = $"{appId}:{sign}";
client.DefaultRequestHeaders.TryAddWithoutValidation("authorization", authorization);
client.DefaultRequestHeaders.Add("timestamps", timeStamp);
}
Log($"GET 请求Url:{url}");
var httpResponse = await client.GetAsync($"{url}");
var response = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{response}");
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "GET 方法请求错误!");
throw;
}
}
/// <summary>
/// Get
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="param"></param>
/// <param name="appId"></param>
/// <param name="appSecret"></param>
/// <returns></returns>
public async Task<string> GetAsync(string url, Dictionary<string, object> param, string appId = "", string appSecret = "")
{
try
{
var client = _httpClientFactory.CreateClient();
client.Timeout = TimeSpan.FromSeconds(30);
var options = new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNameCaseInsensitive = true
};
var urlParam = string.Join("&", param.Select(m => m.Key + "=" + m.Value));
if (url.IndexOf('?') > -1)
{
url += urlParam;
}
else
{
url = url + "?" + urlParam;
}
if (!string.IsNullOrEmpty(appId))
{
client.DefaultRequestHeaders.Add("appid", appId);
}
if (!string.IsNullOrEmpty(appId) && !string.IsNullOrEmpty(appSecret))
{
var timeStamp = GetTimeStamp();
param = param.OrderBy(m => m.Key).ToDictionary(m => m.Key, n => n.Value);
var paramStr = JsonSerializer.Serialize(param, options);
var sign = CreateSign(appId, paramStr, appSecret, timeStamp);
var authorization = $"{appId}:{sign}";
client.DefaultRequestHeaders.TryAddWithoutValidation("authorization", authorization);
client.DefaultRequestHeaders.Add("timestamps", timeStamp);
}
Log($"GET 请求Url:{url}");
var httpResponse = await client.GetAsync($"{url}");
var response = await httpResponse.Content.ReadAsStringAsync();
Log($"请求结果:{response}");
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "GET 方法请求错误!");
throw;
}
}
/// <summary>
/// 生成签名
/// </summary>
/// <param name="appId"></param>
/// <param name="bodyJson"></param>
/// <param name="secret"></param>
/// <param name="timestamps"></param>
/// <returns></returns>
private static string CreateSign(string appId, string bodyJson, string secret, string timestamps)
{
var enStrList = new string[] { appId, bodyJson, secret, timestamps };
Array.Sort(enStrList, string.CompareOrdinal);
var enStr = string.Join("", enStrList);
var md = GetMd5Hash(enStr);
return md;
}
/// <summary>
/// 计算 md5
/// </summary>
/// <param name="enCode"></param>
/// <returns></returns>
private static string GetMd5Hash(string enCode)
{
string res = "";
byte[] data = Encoding.GetEncoding("utf-8").GetBytes(enCode);
MD5 md5 = MD5.Create();
byte[] bytes = md5.ComputeHash(data);
for (int i = 0; i < bytes.Length; i++)
{
res += bytes[i].ToString("x2");
}
return res;
}
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
/// <summary>
/// 加密
/// </summary>
/// <param name="ciphertext"></param>
/// <param name="accessKey"></param>
/// <returns></returns>
private static string EncyptData(string ciphertext, string accessKey)
{
SymmetricAlgorithm des = DES.Create();
Encoding utf = new UTF8Encoding();
byte[] key = utf.GetBytes(accessKey);
byte[] iv = { 0x75, 0x70, 0x63, 0x68, 0x69, 0x6e, 0x61, 0x31 };
ICryptoTransform encryptor = des.CreateEncryptor(key, iv);
byte[] data = utf.GetBytes(ciphertext);
byte[] encData = encryptor.TransformFinalBlock(data, 0, data.Length);
return Convert.ToBase64String(encData);
}
/// <summary>
/// 解密
/// </summary>
/// <param name="cryptograph"></param>
/// <param name="accessKey"></param>
/// <returns></returns>
private static string DecyptData(string cryptograph, string accessKey)
{
SymmetricAlgorithm des = DES.Create();
Encoding utf = new UTF8Encoding();
byte[] key = utf.GetBytes(accessKey);
byte[] iv = { 0x75, 0x70, 0x63, 0x68, 0x69, 0x6e, 0x61, 0x31 };
ICryptoTransform decryptor = des.CreateDecryptor(key, iv);
byte[] encData = Convert.FromBase64String(cryptograph);
byte[] data = decryptor.TransformFinalBlock(encData, 0, encData.Length);
return utf.GetString(data);
}
/// <summary>
/// AES加密算法
/// </summary>
/// <param name="input">明文字符串</param>
/// <returns>字符串</returns>
private static string EncryptByAES(string input, string key, string iv)
{
if (string.IsNullOrWhiteSpace(input))
{
return input;
}
Aes aes = Aes.Create();
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.FeedbackSize = 128;
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = Encoding.UTF8.GetBytes(iv);
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using MemoryStream msEncrypt = new();
using CryptoStream csEncrypt = new(msEncrypt, encryptor, CryptoStreamMode.Write);
using (StreamWriter swEncrypt = new(csEncrypt))
{
swEncrypt.Write(input);
}
byte[] bytes = msEncrypt.ToArray();
return Convert.ToBase64String(bytes);
}
#endregion
}
}