C#(VS2022/.NET 6) HTTPS 通訊程式 模組
C#(VS2022/.NET 6) HTTPS 通訊程式 模組
JSON和Class資料類別
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CS_VPOS
{
/*
{
"client_id": "g4f3edb0-b96f-11ec-8689-97b3100ea64y",
"client_secret": "gd23bb799b566da98e19f0de72108e2b2c784e6535bd62813c358563d3f357fy"
}
*/
public class oauthInput
{
public string client_id { get; set; }
public string client_secret { get; set; }
}
/*
{
"status": "OK",
"message": "",
"data": "",
"access_token": "gyJpdiI6InVPcnQ0RU1uNFVrUlI1Y2oxOGM2elE9PSIsInZhbHVlIjoiYU5OZU83aHNsUWJPdUFWR0RNejJvd3lzL21GaFU3STFObUNOMm1UbEhDdlErbENsd05VQmN0QThpNzI2c09VRkRNR3U2eUJVcy9taml4UzJvVWZLb09LTjI4ZVBZZEM3TTlVdzhsQTNqam5JRFQ2WnJqSG8vUXdKOVZ1dTNVdE1iTmlJZnkzUHBjaUFZZ2VrNjVkS3FPcjFKSExKUnFPMEFmT2ZhUjBkUzRWcm0vTHZFQ2xlQlBseGJOL3Q4UkZPc1pMWnZVUWMzV0RyMDYxdmRRMXNpYjVldm10TjNPQWcvakx1a3hCUGZ6TkQ0WFJVbUpDdCt4VDVVaDFUZndiWFRFd2EwSWhrbitwa0cyUnZIVTN3RVMwaUx2dmRXaGJIUjBHRXRnL2k4M01CN2dvVVhOd0dPUTY2a094ZzhsMHBVaTR6SUN4VlpLNHJIU1ZOK01aMkszTjlyTXZuRXlLUGloeUFvQ1FTcmszeUladFYxbmdhU290RzVBV0N4UTBnRFJGc0c0VnNFTHk2amNtdk1NK0tFTlZiRTdscytHTXd5RXBZRHZvSDh0SnBaTjQxNjZBVmdsbkpJUDdTWUU0eVFtMFZQT1EyRHVzay85aWZRKzNOU2VmbndudldsT1RQNUJMK0tJNFU1cjVBUkF3d1NYTGZXaHJsWWcrOHRyNS9aTTN6UkVDTzE0V0VlRU9HZDlXNFpDdXFpcmRQNEloSDhyeS85cEZUYlVwNnF5b3hkc2YxVXcyMGFMTkdTUEdod3dQREVTd3M2L1RaKzZNTFA1STkzdlozN1hrWFFqUEw1S3NlcGxCWFZnZy95dm1ZcVcrY1ZNdWdZeGZnVFpUNyt4OTlEUitKaHErcXErenVsWU16YW1yN20zNXFMK25mdjBmb29WTDFRMjFMZ3N3OEVtVXJ0blE0dk5sZ3grbjl4cGxvdzhaRzJBVDQ5RURBOFZ0SjU2ei81VTN2V3JBNXg5dU5IanVEZEJJMFlBdlMxZkVOUmk0ZXFzRHY4RlErdVB6THpKWGF0UVdkUDZDZVNpODlDR29tUkJXWi9DQXFWOU1LRjdWUlViVmhjNm9VNS9CRUk1a1pBRkxUUEJBWkFJNUNSTVorSndrNmVPcUVFa0crZ3dUKzVFaHBXMXpJYlR1c2ZUaUtPaFFHN0pwcVQrNVNsbTFsalY5Qks0MGJVWUdMZTFFMWliTk9IZFltdjJSRVhRPT0iLCJtYWMiOiIyNzE2NTVmZmM5MjU0ZmI5ZTQ5NWMzOTBmYmI4ZTQ2MGExZDhiOWQ0ZTkxNTljY2VhNjJjOGQ0YTVhYzE4ZGYwIny=",
"expires_time": "2022-05-26 14:15:59",
"expires_unixtime": 1653545759,
"terminal_sid": "VT-POS-2020-00002"
}
*/
public class oauthResult
{
public string status { get; set; }
public string message { get; set; }
public string data { get; set; }
public string access_token { get; set; }
public string expires_time { get; set; }
public int expires_unixtime { get; set; }
public string terminal_sid { get; set; }
}
}
JSON和Class轉換類別
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//---
//using Newtonsoft.Json;//使用外部函式庫-Newtonsoft.Json.dll (VS2010- .net4X )
//.net6 內建支援json
//https://docs.microsoft.com/zh-tw/dotnet/standard/serialization/system-text-json-how-to?pivots=dotnet-6-0
using System.Text.Json;
//---.net6 內建支援json
namespace CS_VPOS
{
public class JsonClassConvert
{
//---
//oauth API
public static String oauthInput2String(oauthInput inputbuf)
{
String StrResult = "";
StrResult = JsonSerializer.Serialize(inputbuf);
return StrResult;
}
public static oauthResult oauthResult2Class(String inputbuf)
{
oauthResult oauthResult = JsonSerializer.Deserialize<oauthResult>(inputbuf);
return oauthResult;
}
//---oauth API
}//JsonClassConvert
}
檔案相關通用類別
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.Compression;//C# 透過程式壓縮資料夾為zip檔[NET4.5 版本 內建的方法]
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CS_VPOS
{
public class FileLib
{
public static bool DBBackup(String StrName = "")
{
bool blnAns = false;
if (StrName.Length == 0)
{
StrName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip";
}
String StrSrcFullFilePath = String.Format("{0}\\{1}", path, "mysql\\data\\v8_workstation");
string StrOutPath = String.Format("{0}\\{1}", path, "DBBackup\\");
CreateDirectory(StrOutPath);
CreateDirectory(StrOutPath + "v8_workstation\\");
DirectoryCopy(StrSrcFullFilePath, StrOutPath + "v8_workstation\\", true);
ZipFile.CreateFromDirectory(StrOutPath + "\\v8_workstation", StrOutPath + StrName);
DeleteDirectory(StrOutPath + "v8_workstation\\", true);
return blnAns;
}
//刪除目錄,recursive為True時,直接刪除目錄及其目錄下所有文件或子目錄;recursive為False時,需先將目錄下所有文件或子目錄刪除
private static void DeleteDirectory(string path, bool recursive)
{
if (Directory.Exists(path))
{
if (recursive)
{
Directory.Delete(path, true);
}
}
}
public static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
{
// Get the subdirectories for the specified directory.
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
if (!dir.Exists)
{
throw new DirectoryNotFoundException(
"Source directory does not exist or could not be found: "
+ sourceDirName);
}
DirectoryInfo[] dirs = dir.GetDirectories();
// If the destination directory doesn't exist, create it.
if (!Directory.Exists(destDirName))
{
Directory.CreateDirectory(destDirName);
}
// Get the files in the directory and copy them to the new location.
FileInfo[] files = dir.GetFiles();
foreach (FileInfo file in files)
{
string temppath = Path.Combine(destDirName, file.Name);
file.CopyTo(temppath, false);
}
// If copying subdirectories, copy them and their contents to new location.
if (copySubDirs)
{
foreach (DirectoryInfo subdir in dirs)
{
string temppath = Path.Combine(destDirName, subdir.Name);
DirectoryCopy(subdir.FullName, temppath, copySubDirs);
}
}
}
//建立目錄
private static void CreateDirectory(string path)
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
public static string path = System.Windows.Forms.Application.StartupPath;
public static bool IsUTF8File(String StrName)
{
bool blnAns = false;
Stream reader = File.Open(StrName, FileMode.Open, FileAccess.Read);
Encoding encoder = null;
byte[] header = new byte[4];
// 讀取前四個Byte
reader.Read(header, 0, 4);
if (header[0] == 0xFF && header[1] == 0xFE)
{
// UniCode File
reader.Position = 2;
encoder = Encoding.Unicode;
}
else if (header[0] == 0xEF && header[1] == 0xBB && header[2] == 0xBF)
{
// UTF-8 File
reader.Position = 3;
encoder = Encoding.UTF8;
blnAns = true;
}
else
{
// Default Encoding File
reader.Position = 0;
encoder = Encoding.Default;
}
reader.Close();
// .......... 接下來的程式
return blnAns;
}
public static String ImageFile2Base64String(String StrDestFilePath)
{
String StrAns = "";
try
{
//開啟檔案
FileStream file = File.Open(StrDestFilePath, FileMode.Open, FileAccess.Read);
//引用myReader類別
BinaryReader read = new BinaryReader(file);
int len = System.Convert.ToInt32(file.Length);
//讀取位元陣列
byte[] data = read.ReadBytes(len);
StrAns = Convert.ToBase64String(data);
//讀取資料
//釋放資源
read.Close();
read.Dispose();
file.Close();
//file.Flush();
}
catch
{
}
return StrAns;
}
public static void Base64String2ImageFile(String StrDestFilePath, String StrImageData)
{
byte[] data = Convert.FromBase64String(StrImageData);
CreateFile(StrDestFilePath, data);
}
public static void CreateFile(String StrDestFilePath, byte[] byteSource)
{
FileLib.DeleteFile("temp.png");
FileLib.DeleteFile(StrDestFilePath, false);
try
{
//開啟建立檔案
FileStream file = File.Open(StrDestFilePath, FileMode.Create, FileAccess.ReadWrite);
BinaryWriter write = new BinaryWriter(file);
write.Write(byteSource);
write.Close();
write.Dispose();
write.Flush();
file.Close();
file.Flush();
file.Dispose();
}
catch
{
}
}
public static void CopyFile(String StrSourceFilePath, String StrDestFilePath)
{
System.IO.File.Copy(StrSourceFilePath, StrDestFilePath, true);
}
public static void DeleteFile(String StrFileName, bool blnAtRoot = true)
{
String FilePath = "";
if (blnAtRoot == true)
{
FilePath = path + "\\" + StrFileName;
}
else
{
FilePath = StrFileName;
}
if (System.IO.File.Exists(FilePath))
{
try
{
System.IO.File.Delete(FilePath);
}
catch
{
}
}
}
public static void WriteTxtFile(String StrFileName, String StrData)
{
StreamWriter sw = new StreamWriter(StrFileName);
sw.WriteLine(StrData);// 寫入文字
sw.Close();// 關閉串流
}
public static String ReadTxtFile(String StrFileName, bool blnOneLine = true)
{
String StrResult = "";
String StrData = "";
StreamReader sr = new StreamReader(StrFileName);
while (!sr.EndOfStream)
{
if (StrResult.Length > 0)
{
StrResult += "\n";
}
StrData = sr.ReadLine();// 寫入文字
StrResult += StrData;
if (blnOneLine)
{
break;
}
}
sr.Close();// 關閉串流
return StrResult;
}
public static void TxtFile(String StrFileName, String StrData)
{
StreamWriter sw = new StreamWriter(StrFileName);
sw.WriteLine(StrData);// 寫入文字
sw.Close();// 關閉串流
}
public static void logFile(String StrFileName, String StrData, bool blnAutoTime = true)
{
FileStream fs = new FileStream(StrFileName, FileMode.Append);
StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
if (blnAutoTime == true)
{
sw.WriteLine(DateTime.Now.ToString("HH:mm:ss - ") + StrData);// 寫入文字
}
else
{
sw.WriteLine(StrData);// 寫入文字
}
sw.Close();// 關閉串流
}
//---
//除錯(DEBUG)專用 log函式庫
public static bool g_blnDebug = false;
public static StreamWriter g_sw;
public static void createLogFile()
{
if (g_blnDebug == true)
{
g_sw = new StreamWriter(Application.StartupPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd-HHmm") + ".log");
writeLogFile("createLogFile");
}
}
public static void writeLogFile(String msg)
{
if (g_blnDebug == true)
{
g_sw.WriteLine(msg + ",\t" + DateTime.Now.ToString("yyyy/MM/dd/HH:mm:ss"));
}
}
public static void closeLogFile()
{
if (g_blnDebug == true)
{
writeLogFile("closeLogFile");
g_sw.Close();// 關閉串流
}
}
//---除錯(DEBUG)專用 log函式庫
//---
//縮圖
public static bool ImageResize(String strImageSrcPath, String strImageDesPath, int intWidth = 0, int intHeight = 0)
{
/*
ImageFormat IF_Png = ImageFormat.Png;
bool blnAns = true;
Image objImage = Image.FromFile(strImageSrcPath);
if (intWidth > objImage.Width)
{
intWidth = objImage.Width;
}
if (intHeight > objImage.Height)
{
intHeight = objImage.Height;
}
if ((intWidth == 0) && (intHeight == 0))
{
intWidth = objImage.Width;
intHeight = objImage.Height;
}
else if ((intHeight == 0) && (intWidth != 0))
{
intHeight = (int)(objImage.Height * intWidth / objImage.Width);
}
else if ((intWidth == 0) && (intHeight != 0))
{
intWidth = (int)(objImage.Width * intHeight / objImage.Height);
}
Bitmap imgOutput = new Bitmap(objImage, intWidth, intHeight);
imgOutput.Save(strImageDesPath, IF_Png);//imgOutput.Save(strImageDesPath, objImage.RawFormat);
objImage.Dispose();
objImage = null;
imgOutput.Dispose();
imgOutput = null;
return blnAns;
*/
Process m_pro;
String StrVar = String.Format("\"{0}\" \"{1}\" {2}", strImageSrcPath, strImageDesPath, intWidth);
ProcessStartInfo startInfo = new ProcessStartInfo("CS_cmd_ImageResize.exe", StrVar);
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
try
{
m_pro = Process.Start(startInfo);
}
catch
{
return false;//找不到執行檔的防呆 at 2017/06/16
}
if (m_pro != null)
{
m_pro.WaitForExit();//下載SERVER資料
m_pro = null;
}
return true;
}
//---縮圖
}
}
https API 存取基底類別
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Cache;
using System.Text;
using System.Threading.Tasks;
namespace CS_VPOS
{
public class HttpsFun
{
private static bool m_blnlogfile = true;
private static bool m_blnTestMode = true;
private static String m_StrDomain = "https://jashliao.eu/wordpress/test";
public static void setDomainMode(bool blnTestMode=true)
{
m_blnTestMode=blnTestMode;
m_StrDomain = (m_blnTestMode) ? "https://jashliao.eu/wordpress/test" : "https://jashliao.eu/wordpress";
}
public static void setHeader(ref HttpWebRequest request,String StrHeaderName,String StrHeaderValue)//新增HTTP/HTTPS的Header參數
{
if((StrHeaderName.Length>0)&&(StrHeaderValue.Length>0))
{
request.Headers[StrHeaderName] = StrHeaderValue;
}
}
public static String RESTfulAPI_get(String path)
{
//string url= "http://192.168.1.68:24410/syris/sydm/controller";
String StrHeaderName = "";
String StrHeaderValue = "";
String StrData = "";
String url = m_StrDomain + path;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
setHeader(ref request, StrHeaderName, StrHeaderValue);
request.KeepAlive = false;
//--
//定義此req的緩存策略
//https://msdn.microsoft.com/zh-tw/library/system.net.webrequest.cachepolicy(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = noCachePolicy;
//--
request.Method = "GET";//request.Method = "POST";
//request.ContentType = "application/x-www-form-urlencoded";
Thread.Sleep(100);
System.Net.ServicePointManager.DefaultConnectionLimit = 200;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string encoding = response.ContentEncoding;
if (encoding == null || encoding.Length < 1)
{
encoding = "UTF-8"; //預設編碼
}
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
StrData = reader.ReadToEnd();
response.Close();
//---
//手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
request.Abort();
response = null;
request = null;
GC.Collect();//手動記憶體回收
//---手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
}
catch (Exception e)
{
StrData += e.Message;
}
if (m_blnlogfile)//記錄所有V09_API呼叫log
{
FileLib.logFile(DateTime.Now.ToString("yyyyMMdd") + ".log", "RESTfulAPI_get :" + url + ";" + StrData);
}
return StrData;
}
public static String RESTfulAPI_postBody(String path, String StrInput)
{
String StrHeaderName = "";
String StrHeaderValue = "";
String StrData = "";
String url = m_StrDomain + path;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
setHeader(ref request, StrHeaderName, StrHeaderValue);
request.KeepAlive = false;
//--
//定義此req的緩存策略
//https://msdn.microsoft.com/zh-tw/library/system.net.webrequest.cachepolicy(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = noCachePolicy;
//--
request.Method = "POST";
//--
//request.ContentType = "application/x-www-form-urlencoded";//一般POST
request.ContentType = "application/json; charset=UTF-8";//POST to AJAX [is_ajax_request()]
//request.Accept = "application/json, text/javascript";//POST to AJAX [is_ajax_request()]
//request.UserAgent = "";//POST to AJAX [is_ajax_request()]
//request.Headers.Add("X-Requested-With", "XMLHttpRequest");//POST to AJAX [is_ajax_request()]
//--
//request.ContentLength = data1.Length;
//StreamWriter writer = new StreamWriter(request.GetRequestStream());//CS2PHPrestfulapi 傳送全部改為UTF8
//writer.Write(StrInput);
//writer.Flush();
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(StrInput);
streamWriter.Flush();
}
Thread.Sleep(100);
System.Net.ServicePointManager.DefaultConnectionLimit = 200;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string encoding = response.ContentEncoding;
if (encoding == null || encoding.Length < 1)
{
encoding = "UTF-8"; //默认编码
}
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
StrData = reader.ReadToEnd();
response.Close();
//---
//手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
request.Abort();
response = null;
request = null;
GC.Collect();//手動記憶體回收
//---手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
}
catch (Exception e)
{
StrData = e.Message;
}
if (m_blnlogfile)//記錄所有V09_API呼叫log
{
FileLib.logFile(DateTime.Now.ToString("yyyyMMdd") + ".log", "RESTfulAPI_postBody :" + StrInput + ";" + StrData);
}
return StrData;
}
}
}
GUI 測試程式
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace CS_VPOS
{
public partial class test_buf : Form
{
//---
//把http API呼叫換成支援https API模式
public bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
public void CS_https_tls_setting()
{
//REF: https://stackoverflow.com/a/39534068/288936
ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls13 |
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;//.net6 不支援SecurityProtocolType.Ssl3執行會報錯
//REF: https://docs.microsoft.com/zh-tw/dotnet/api/system.net.servicepointmanager.expect100continue?view=netframework-4.7.2
//REF: https://www.cnblogs.com/dudu/p/the_remote_certificate_is_invalid_according_to_the_validation_procedure.html
ServicePointManager.UseNagleAlgorithm = true;
ServicePointManager.Expect100Continue = true;
ServicePointManager.CheckCertificateRevocationList = false;//The remote certificate is invalid according to the validation procedure
ServicePointManager.DefaultConnectionLimit = ServicePointManager.DefaultPersistentConnectionLimit;
//REF: http://libraclark.blogspot.com/2007/06/ssl.html
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
}
//---把http API呼叫換成支援https API模式
public test_buf()
{
InitializeComponent();
}
private void test_buf_Load(object sender, EventArgs e)
{
CS_https_tls_setting();
HttpsFun.setDomainMode();
oauthInput oauthInputBuf=new oauthInput();
oauthInputBuf.client_id = "y4f3edb0-b96f-11ec-8689-97b3100ea64g";
oauthInputBuf.client_secret = "gd23bb799b566da98e19f0de72108e2b2c784e6535bd62813c358563d3f357fy";
String StrData = JsonClassConvert.oauthInput2String(oauthInputBuf);
String StrResult = HttpsFun.RESTfulAPI_postBody("/api/oauth", StrData);
oauthResult oauthResultBuf=JsonClassConvert.oauthResult2Class(StrResult);
MessageBox.Show(oauthResultBuf.access_token+ "\n\n"+oauthResultBuf.expires_time);
}
}
}
One thought on “C#(VS2022/.NET 6) HTTPS 通訊程式 模組”
C# 目錄 偵測
Directory.Exists(String)