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.

384 lines
14 KiB
C#

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 JwKdsV.Core.HttpApi;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Management;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace JwKdsV.Core.Utils
{
public class HttpClientUtils
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static object _lock = new object();
private static Dictionary<ApiType, HttpClient> _clients = new Dictionary<ApiType, HttpClient>();
private static HttpClient GetHttpClient(OpenApi api)
{
HttpClient httpClient = null;
lock (_lock)
{
if (!_clients.ContainsKey(api.ApiType))
{
var handler = new HttpClientHandler();
if (handler.SupportsAutomaticDecompression)
{
handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
}
handler.Proxy = null;
handler.UseProxy = false;
handler.UseDefaultCredentials = false;
OpenApi apis = OpenApiUtils.Instance.NextApi(ApiType.Business);
Interlocked.CompareExchange(ref httpClient, new HttpClient(handler) { BaseAddress = new Uri(apis.Url) }, null);
httpClient.DefaultRequestHeaders.Connection.Add("Keep-Alive");
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36");
httpClient.DefaultRequestHeaders.Add("Accept", "*/*");
httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate"); //声明给服务器客户端支持gzip解压
httpClient.DefaultRequestHeaders.Add("Accept-Language", "zh-cn,en-us;q=0.7,en;q=0.3");
httpClient.DefaultRequestHeaders.Add("Pragma", "no-cache");
httpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
httpClient.Timeout = TimeSpan.FromMilliseconds(10000);
_clients[api.ApiType] = httpClient;
}
else
{
httpClient = _clients[api.ApiType];
}
}
return httpClient;
}
/// <summary>
/// 指示开放平台是否可用
/// </summary>
/// <returns></returns>
public static bool IsAvailable(ApiType apiType)
{
try
{
Stopwatch watch = Stopwatch.StartNew();
bool isConnected = NetworkAvailable();
//如果网络可用,检测开放平台
if (isConnected)
{
isConnected = OpenAvailable(apiType);
}
logger.Info("网络检测耗时<{0}>毫秒,结果<{1}>", watch.ElapsedMilliseconds, isConnected);
return isConnected;
}
catch (Exception ex)
{
logger.Error(ex, "无法连接" + apiType + "开放平台");
return false;
}
}
public static bool NetworkAvailable()
{
//是否有可用网卡
var networkLinkTask = Task.Factory.StartNew<bool>(() => { return NetworkUtils.IsNetworkLink(); });
//是否连接互联网
var connectedTask = Task.Factory.StartNew<bool>(() => { return NetworkUtils.IsConnectedToInternet(); });
//判断是否有可用的网络
Task.WaitAll(networkLinkTask, connectedTask);
//网络可用:a)网卡工作;b)可以联网
bool isConnected = networkLinkTask.Result && connectedTask.Result;
return isConnected;
}
/// <summary>
/// 开放平台sayhello
/// </summary>
/// <returns></returns>
public static bool OpenAvailable(ApiType apiType)
{
OpenApi apis = OpenApiUtils.Instance.NextApi(apiType);
var httpClient = GetHttpClient(apis);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(apis);
parameters.Add("method", "common.sayhello");
parameters.Add("sign", OpenApiUtils.Instance.Sign(apis, parameters));
var task = httpClient.PostAsync(apis.Url, new FormUrlEncodedContent(parameters));
task.Result.EnsureSuccessStatusCode();
return task.Result.IsSuccessStatusCode;
}
public static string PostAsync(OpenApi api, string url, SortedList<string, string> parameters)
{
Stopwatch watch = Stopwatch.StartNew();
try
{
var httpClient = GetHttpClient(api);
var task = httpClient.PostAsync(url, new FormUrlEncodedContent(parameters));
HttpResponseMessage response = task.Result.EnsureSuccessStatusCode();
var result = response.Content.ReadAsStringAsync();
return result.Result;
}
catch (Exception ex)
{
string message = "调用PostAsync方法发生错误";
if (parameters != null && parameters.ContainsKey("method"))
{
message = "调用<" + parameters["method"] + ">发生错误";
}
logger.Error(ex, message);
throw new Exception(message);
}
finally
{
string methodName = "NoDefined";
if (parameters != null && parameters.ContainsKey("method"))
{
methodName = parameters["method"];
}
logger.Info("调用<{0}>方法,耗时<{1}>毫秒", methodName, watch.ElapsedMilliseconds);
}
}
public static void PosMonitor()
{
try
{
if (Global.Instance.Online && Global.Instance.StoreInfo != null)
{
Stopwatch watch = Stopwatch.StartNew();
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
parameters.Add("method", "pos.monitor");
parameters.Add("storeId", Global.Instance.StoreInfo.StoreId);
parameters.Add("posNo", Global.Instance.StoreInfo.PosNo);
string osVersionName = GetOsVersion(Environment.OSVersion.Version);
string servicePack = Environment.OSVersion.ServicePack;
osVersionName = osVersionName + " " + servicePack;
parameters.Add("os", osVersionName);
bool is64Os = Environment.Is64BitOperatingSystem;
parameters.Add("osType", is64Os ? "64" : "32");
parameters.Add("softwareVersion", Application.ProductVersion.ToString());
parameters.Add("memoryTotalSize", GetPhisicalMemory().ToString());
parameters.Add("memoryFreeSize", GetFreePhysicalMemory().ToString());
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
string diskName = baseDir.Substring(0, 1).ToUpper();//取首字母并转为大写
parameters.Add("diskName", diskName + ":");
parameters.Add("diskTotalSize", GetHardDiskSpace(diskName).ToString());
parameters.Add("diskFreeSize", GetHardDiskFreeSpace(diskName).ToString());
parameters.Add("cpuSize", Environment.ProcessorCount.ToString());
var ignoreParameters = new List<string>();
ignoreParameters.Add("os");
ignoreParameters.Add("osType");
ignoreParameters.Add("softwareVersion");
ignoreParameters.Add("memoryTotalSize");
ignoreParameters.Add("memoryFreeSize");
ignoreParameters.Add("diskName");
ignoreParameters.Add("diskTotalSize");
ignoreParameters.Add("diskFreeSize");
ignoreParameters.Add("cpuSize");
parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters));
var response = PostAsync(api, api.Url, parameters);
if (Constant.IsSuccessful(response))
{
}
else
{
}
logger.Info("<pos.monitor>方法调用耗时<{0}>毫秒", watch.ElapsedMilliseconds);
}
}
catch (Exception ex)
{
logger.Error(ex, "POS监控异常");
}
}
/// <summary>
/// 获取指定驱动器的空间总大小(单位为M)
/// </summary>
/// <param name="diskName"></param>
/// <returns></returns>
public static long GetHardDiskSpace(string diskName)
{
long totalSize = new long();
diskName = diskName + ":\\";
System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
foreach (System.IO.DriveInfo drive in drives)
{
if (drive.Name == diskName)
{
totalSize = drive.TotalSize / (1024 * 1024);
}
}
return totalSize;
}
/// <summary>
/// 获取指定驱动器的剩余空间总大小(单位为M)
/// </summary>
/// <param name="diskName"></param>
/// <returns></returns>
public static long GetHardDiskFreeSpace(string diskName)
{
long freeSpace = new long();
diskName = diskName + ":\\";
System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
foreach (System.IO.DriveInfo drive in drives)
{
if (drive.Name == diskName)
{
freeSpace = drive.TotalFreeSpace / (1024 * 1024);
}
}
return freeSpace;
}
/// <summary>
/// 获取空闲内存(单位为M)
/// </summary>
/// <returns></returns>
public static int GetFreePhysicalMemory()
{
long availablebytes = 0;
try
{
ManagementClass mos = new ManagementClass("Win32_OperatingSystem");
foreach (ManagementObject mo in mos.GetInstances())
{
if (mo["FreePhysicalMemory"] != null)
{
availablebytes = long.Parse(mo["FreePhysicalMemory"].ToString());
}
}
}
catch
{
availablebytes = 0;
}
return (int)(availablebytes / 1024);
}
/// <summary>
/// 获取系统内存大小(单位M)
/// </summary>
/// <returns>内存大小</returns>
private static int GetPhisicalMemory()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher(); //用于查询一些如系统信息的管理对象
searcher.Query = new SelectQuery("Win32_PhysicalMemory ", "", new string[] { "Capacity" });//设置查询条件
ManagementObjectCollection collection = searcher.Get(); //获取内存容量
ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator();
long capacity = 0;
while (em.MoveNext())
{
ManagementBaseObject baseObj = em.Current;
if (baseObj.Properties["Capacity"].Value != null)
{
try
{
capacity += long.Parse(baseObj.Properties["Capacity"].Value.ToString());
}
catch
{
return 0;
}
}
}
return (int)(capacity / 1024 / 1024);
}
private static string GetOsVersion(Version ver)
{
string strClient = "";
if (ver.Major == 5 && ver.Minor == 0)
{
strClient = "Win2000";
}
else if (ver.Major == 5 && ver.Minor == 1)
{
strClient = "WinXP";
}
else if (ver.Major == 6 && ver.Minor == 0)
{
strClient = "WinVista";
}
else if (ver.Major == 6 && ver.Minor == 1)
{
strClient = "Win7";
}
else if (ver.Major == 6 && ver.Minor == 2)
{
strClient = "Win8+";
}
else if (ver.Major == 10 && ver.Minor == 0)
{
strClient = "Win10";
}
else
{
strClient = "未知";
}
return strClient;
}
/// <summary>
/// 操作系统类型
/// </summary>
/// <returns></returns>
public static string GetSystemType()
{
string st = "";
ManagementClass mc = new ManagementClass("Win32_ComputerSystem");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
st = mo["SystemType"].ToString();
}
return st;
}
}
}