璽瑞(SYRIS)_C#(VS2015/.net 4.X) HTTPS 通訊程式 模組

璽瑞(SYRIS)_C#(VS2015/.net 4.X) HTTPS 通訊程式 模組

璽瑞(SYRIS)_C#(VS2015/.net 4.X) HTTPS 通訊程式 模組


資料來源:

https://github.com/jash-git/CS-Reading-REST-API-chunked
https://github.com/jash-git/CS_WebClient_TLS_Download
https://github.com/jash-git/CS_wait_PHP


01.允許https證書進行網路認證模塊 (主程式必須引入執行)

        //---
        //把API呼叫換成支援https模式
        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.Ssl3 | SecurityProtocolType.Tls |
                SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

            //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);
        }
        //---把API呼叫換成支援https模式


02.cloud API 通訊

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Net;
using System.IO;
using System.Net.Cache;
using System.Threading;
using System.Windows.Forms;
using System.Collections;

namespace SYWEB_V8_Workstation
{
    public class CS2PHPrestfulapi
    {
        public static bool m_blnReadOneLine = false;//授權改成有收到回應就離開

        public static string [] m_StrChunkedNewData;
        public static string [] m_StrChunkedOldData;
        //把TIMER在做資料存放到FIFO的工作移至執行緒中,確保資料的完整性 public static string [] m_StrCardEventData;
        public static Thread [] m_ThreadChunked;
        public static string[] m_StrSYDMVar;

        public const int m_intCardEventSize = 200;
        public static String[] m_StrCardEventShowData = new String[m_intCardEventSize];//把TIMER在做資料存放到FIFO的工作移至執行緒中,確保資料的完整性
        public static bool m_blnNewChunked00 = false;// 修正即時監控和有源標籤監測的清掉資料判斷機制

        public const int m_intActiveRFIDSize = 5000;
        public static String[] m_StrActiveRFIDShowData = new String[m_intActiveRFIDSize];//把TIMER在做資料存放到FIFO的工作移至執行緒中,確保資料的完整性
        public static bool m_blnNewChunked01 = false;// 修正即時監控和有源標籤監測的清掉資料判斷機制

        public static int m_intCountChunked = 0;

        public static String m_StrX_GAPI_Token = "";//X-GAPI-Token
        public static String m_StrX_GAPI_Signature = "";//X-GAPI-Signature
        public static String m_StrX_GAPI_Countersign = "";//X-GAPI-Countersign
        public static void setHttpGAPIHeader(ref HttpWebRequest request)
        {
            if (m_StrX_GAPI_Token.Length>0)
            {
                request.Headers["X-GAPI-Token"] = m_StrX_GAPI_Token;
            }
            if (m_StrX_GAPI_Signature.Length > 0)
            {
                request.Headers["X-GAPI-Signature"] = m_StrX_GAPI_Signature;
            }
            if (m_StrX_GAPI_Countersign.Length > 0)
            {
                request.Headers["X-GAPI-Countersign"] = m_StrX_GAPI_Countersign;
            }

        }

        public static void shiftCardEventDataArray(String StrData)//把TIMER在做資料存放到FIFO的工作移至執行緒中,確保資料的完整性
        {
            FileLib.logFile("CardEventShowRawData.txt", StrData);//建立正確時的即時訊息Raw Data LOG
            
            for (int i = (m_StrCardEventShowData.Length - 2); i >= 0; i--)
            {
                m_StrCardEventShowData[i + 1] = m_StrCardEventShowData[i];
            }
            m_StrCardEventShowData[0] = StrData;

            m_blnNewChunked00 = true;//修正即時監控和有源標籤監測的清掉資料判斷機制
            m_intCountChunked++;
        }

        public static void shiftActiveRFIDDataArray(String StrData)//把TIMER在做資料存放到FIFO的工作移至執行緒中,確保資料的完整性
        {
            FileLib.logFile("ActiveRFIDShowRawData.txt", StrData);//建立正確時的即時訊息Raw Data LOG

            for (int i = (m_StrActiveRFIDShowData.Length - 2); i >= 0; i--)
            {
                m_StrActiveRFIDShowData[i + 1] = m_StrActiveRFIDShowData[i];
            }
            m_StrActiveRFIDShowData[0] = StrData;

            m_blnNewChunked01 = true;//修正即時監控和有源標籤監測的清掉資料判斷機制
            m_intCountChunked++;
        }

        public static void Thread_funGet(object arg)//新增接收chunked執行序主體函數
        {
            String StrData = (String)arg;
            string[] strs = StrData.Split('$');
            RESTfulAPI_getchunked(strs[0], strs[1], Convert.ToInt32(strs[2]));
        }

        public static void RESTfulAPI_getchunked(String url, String data, int index)//新增專用POST模式下的chunked函數
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                setHttpGAPIHeader(ref request);
                //--
                //定義此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.ContentType = "application/json; charset=UTF-8";//POST to AJAX [is_ajax_request()]

                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"; //默认编码
                }

                //---
                //add 2017/12/20
                //Reading “chunked” response with HttpWebResponse - https://stackoverflow.com/questions/16998/reading-chunked-response-with-httpwebresponse
                StringBuilder sb = new StringBuilder();
                Byte[] buf = new byte[8192];
                Stream resStream = response.GetResponseStream();
                string tmpString = null;
                int count = 0;
                do
                {
                    count = resStream.Read(buf, 0, buf.Length);
                    if (count != 0)
                    {
                        tmpString = Encoding.UTF8.GetString(buf, 0, count);
                        FileLib.logFile("EventGetRawData.txt", tmpString);//建立收到資料第一時間的即時訊息Raw Data LOG                        
                        m_StrChunkedNewData[index] = tmpString;
                        if (m_StrChunkedNewData[index] != m_StrChunkedOldData[index])
                        {
                            m_StrChunkedOldData[index] = m_StrChunkedNewData[index];

                            //---
                            //修改即時監控,當一次收到多筆時也要能拆解資料並顯示而非判定為不能解析資料        
                            string[] lines = m_StrChunkedNewData[index].Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);//修改即時監控,當一次收到多筆時也要能拆解資料並顯示而非判定為不能解析資料~
                            for (int i = 0; i < lines.Length; i++)
                            {

                                if (lines[i].Contains("\"type\":5"))
                                {
                                    //---
                                    //JSON2OBJ
                                    try
                                    {
                                        V092_ActiveRFIDLog ARLBuf = null;
                                        ARLBuf = parseJSON.parseV092_ActiveRFIDLog(lines[i]);

                                        //---
                                        //過濾
                                        bool blnshowData = false;

                                        blnshowData = true;
                                        if (blnshowData == true)
                                        {
                                            shiftActiveRFIDDataArray(lines[i]);
                                        }
                                        //---過濾
                                    }
                                    catch
                                    {
                                        FileLib.logFile("EventErrorRawData.txt", lines[i]);//修改即時監控,當一次收到多筆時也要能拆解資料並顯示而非判定為不能解析資料~ FileLib.logFile("CardEventErrorRawData.txt", m_StrChunkedNewData[index]);//建立錯誤時的即時訊息Raw Data LOG
                                    }
                                    //---JSON2OBJ
                                }

                                if (lines[i].Contains("\"type\":4"))//修改即時監控,當一次收到多筆時也要能拆解資料並顯示而非判定為不能解析資料~ if (m_StrChunkedNewData[index].Contains("\"type\":4"))
                                {
                                    //---
                                    //JSON2OBJ
                                    try
                                    {
                                        V09_CardEventlog CELBuf = null;
                                        CELBuf = parseJSON.parseV09_CardEventlog(lines[i]);//修改即時監控,當一次收到多筆時也要能拆解資料並顯示而非判定為不能解析資料~ CELBuf = parseJSON.parseV09_CardEventlog(m_StrChunkedNewData[index]);
                                        
                                        //---
                                        //即時監控UI的過濾條件判斷機制搬到執行序執行
                                        bool blnshowData = false;
                                        int intsate = -1;
                                        int intid = -1;
                                        int intsn = -1;
                                        for (int x = 0; x < Main_Frm.pForm1.m_ALCardEventState.Count; x++)
                                        {
                                            intsate = Convert.ToInt32(Main_Frm.pForm1.m_ALCardEventState[x].ToString());
                                            for (int y = 0; y < Main_Frm.pForm1.m_ALCardEventDoor.Count; y++)
                                            {
                                                string[] strs = Main_Frm.pForm1.m_ALCardEventDoor[y].ToString().Split(',');
                                                intid = Convert.ToInt32(strs[0]);
                                                intsn = Convert.ToInt32(strs[1]);
                                                if ((CELBuf.status == intsate) && (CELBuf.controller_door_index == intid) && (CELBuf.controller_serial_number == intsn))
                                                {
                                                    blnshowData = true;
                                                    break;
                                                }
                                            }
                                            if (blnshowData == true)
                                            {
                                                break;
                                            }
                                        }
                                        if (blnshowData == true)
                                        {
                                            shiftCardEventDataArray(lines[i]);//修改即時監控,當一次收到多筆時也要能拆解資料並顯示而非判定為不能解析資料~ shiftCardEventDataArray(m_StrChunkedNewData[index]);//把TIMER在做資料存放到FIFO的工作移至執行緒中,確保資料的完整性
                                        }
                                        //---即時監控UI的過濾條件判斷機制搬到執行序執行

                                    }
                                    catch
                                    {
                                        FileLib.logFile("EventErrorRawData.txt", lines[i]);//修改即時監控,當一次收到多筆時也要能拆解資料並顯示而非判定為不能解析資料~ FileLib.logFile("CardEventErrorRawData.txt", m_StrChunkedNewData[index]);//建立錯誤時的即時訊息Raw Data LOG
                                    }
                                    //---JSON2OBJ
                                }
                            }
                            //---修改即時監控,當一次收到多筆時也要能拆解資料並顯示而非判定為不能解析資料
                        }
                    }

                    Thread.Sleep(10);
                } while (count >= 0);

                response.Close();
                //---
                //手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
                request.Abort();
                response = null;
                request = null;
                GC.Collect();//手動記憶體回收
                //---手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
            }
            catch
            {

            }
        }

        public static void Thread_funPost(object arg)//新增接收chunked執行序主體函數
        {
            String StrData = (String)arg;
            string[] strs = StrData.Split('$');
            RESTfulAPI_postchunked(strs[0], strs[1], Convert.ToInt32(strs[2]));
        }

        public static void RESTfulAPI_postchunked(String url, String data, int index)//新增專用POST模式下的chunked函數
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                setHttpGAPIHeader(ref request);
                //--
                //定義此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(), Encoding.ASCII);//CS2PHPrestfulapi 傳送全部改為UTF8
                //writer.Write(data1);
                //writer.Flush();
                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(data);
                    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"; //默认编码
                }

                //---
                //add 2017/12/20
                //Reading “chunked” response with HttpWebResponse - https://stackoverflow.com/questions/16998/reading-chunked-response-with-httpwebresponse
                StringBuilder sb = new StringBuilder();
                Byte[] buf = new byte[8192];
                Stream resStream = response.GetResponseStream();
                string tmpString = null;
                int count = 0;
                do
                {
                    count = resStream.Read(buf, 0, buf.Length);
                    /*
                    if (count != 0)
                    {
                        tmpString = Encoding.UTF8.GetString(buf, 0, count);
                        m_StrNewData[index] = tmpString;
                    }                      
                    */
                    if (count != 0)
                    {
                        tmpString = Encoding.UTF8.GetString(buf, 0, count);
                        FileLib.logFile("EventGetRawData.txt", tmpString);//建立收到資料第一時間的即時訊息Raw Data LOG
                        m_StrChunkedNewData[index] = tmpString;
                        if (m_StrChunkedNewData[index] != m_StrChunkedOldData[index])
                        {
                            m_StrChunkedOldData[index] = m_StrChunkedNewData[index];
                            if (m_StrChunkedNewData[index].Contains("\"type\":4"))
                            {
                                //---
                                //JSON2OBJ                                
                                try
                                {
                                    CardEventlog CELBuf = null;
                                    CELBuf = parseJSON.parseSYCG_CardEventLog(m_StrChunkedNewData[index]);
                                    //---
                                    //即時監控UI的過濾條件判斷機制搬到執行序執行

                                    bool blnshowData = false;
                                    int intsate = -1;
                                    int intid = -1;
                                    int intsn = -1;
                                    for (int x = 0; x < Main_Frm.pForm1.m_ALCardEventState.Count; x++)
                                    {
                                        intsate = Convert.ToInt32(Main_Frm.pForm1.m_ALCardEventState[x].ToString());
                                        for (int y = 0; y < Main_Frm.pForm1.m_ALCardEventDoor.Count; y++)
                                        {
                                            string[] strs = Main_Frm.pForm1.m_ALCardEventDoor[y].ToString().Split(',');
                                            intid = Convert.ToInt32(strs[0]);
                                            intsn = Convert.ToInt32(strs[1]);
                                            if ((CELBuf.message.status == intsate) && (CELBuf.message.controller_door_index == intid) && (CELBuf.message.controller_serial_number == intsn))
                                            {
                                                blnshowData = true;
                                                break;
                                            }
                                        }
                                        if (blnshowData == true)
                                        {
                                            break;
                                        }
                                    }
                                    if (blnshowData == true)
                                    {
                                        shiftCardEventDataArray(m_StrChunkedNewData[index]);//把TIMER在做資料存放到FIFO的工作移至執行緒中,確保資料的完整性
                                    }
                                    //---即時監控UI的過濾條件判斷機制搬到執行序執行
                                }
                                catch
                                {
                                    FileLib.logFile("EventErrorRawData.txt", m_StrChunkedNewData[index]);//建立錯誤時的即時訊息Raw Data LOG
                                }
                                //---JSON2OBJ
                            }
                        }
                    }
                    
                    Thread.Sleep(10);
                } while (count >= 0);

                response.Close();
                //---
                //手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
                request.Abort();
                response = null;
                request = null;
                GC.Collect();//手動記憶體回收
                //---手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
            }
            catch
            {

            }
        }


        public static void RESTfulAPI_getchunked(String url,int index)//新增GET模式下的chunked函數
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                setHttpGAPIHeader(ref request);
                //request.SendChunked = true;
                //--
                //定義此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"; //預設編碼
                }

                //---
                //add 2017/12/20
                //Reading “chunked” response with HttpWebResponse - https://stackoverflow.com/questions/16998/reading-chunked-response-with-httpwebresponse
                StringBuilder sb = new StringBuilder();
                Byte[] buf = new byte[8192];
                Stream resStream = response.GetResponseStream();
                string tmpString = null;
                int count = 0;
                do
                {
                    count = resStream.Read(buf, 0, buf.Length);
                    if (count != 0)
                    {
                        tmpString = Encoding.UTF8.GetString(buf, 0, count);
                        m_StrChunkedNewData[index] = tmpString;
                        if (m_StrChunkedNewData[index] != m_StrChunkedOldData[index])
                        {
                            m_StrChunkedOldData[index] = m_StrChunkedNewData[index];
                        }
                    }
                    Thread.Sleep(10);
                } while (count >= 0);

                response.Close();
                //---
                //手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
                request.Abort();
                response = null;
                request = null;
                GC.Collect();//手動記憶體回收
                //---手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
            }
            catch
            {

            }
        }

        public static String RESTfulAPI_get(String url)
        {
            //string url= "http://192.168.1.68:24410/syris/sydm/controller";
            String StrData="";
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                setHttpGAPIHeader(ref request);
                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();

                //---
                //修正當SYCG沒插KEY時雖然API會有回應,但是回應內容會是亂碼非JSON格式,導致系統死當問題
                if (StrData.Substring(0, 1) != "{" && StrData.Substring(StrData.Length-1, 1) != "}")
                {
                    StrData = "{\"Ans\":\"Error\"}";
                    MessageBox.Show(Language.m_StrAPIMsg01, Language.m_StrAPIMsg00, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                //---修正當SYCG沒插KEY時雖然API會有回應,但是回應內容會是亂碼非JSON格式,導致系統死當問題
                response.Close();
                //---
                //手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
                request.Abort();
                response = null;
                request = null;
                GC.Collect();//手動記憶體回收
                //---手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
            }
            catch (Exception e)
            {
                StrData = "{\"Ans\":\"Error\"}";
                StrData += e.Message;
            }

            if (SYCGV098.m_blnlogfile)//記錄所有V09_API呼叫log
            {
                FileLib.logFile(DateTime.Now.ToString("yyyyMMdd") + ".log", SYCGV098.m_StrAPIName + ":" + url + ";" + StrData);
            }
            return StrData;
        }

        public static String RESTfulAPI_postBody(String url, String data1, bool blnchunked=false)
        {
            String data = "";
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                setHttpGAPIHeader(ref request);
                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(data1);
                //writer.Flush();
                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(data1);
                    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"; //默认编码
                }
                if (!blnchunked)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
                    //---
                    //授權改成有收到回應就離開
                    //data = reader.ReadToEnd();
                    if (!m_blnReadOneLine)
                    {
                        data = reader.ReadToEnd();
                    }
                    else
                    {
                        data = reader.ReadLine();
                        data += "\n{\"result\":0}";
                        m_blnReadOneLine = false;
                    }
                    //---授權改成有收到回應就離開
                }
                else
                {
                    //---
                    //add 2017/12/20
                    //Reading “chunked” response with HttpWebResponse - https://stackoverflow.com/questions/16998/reading-chunked-response-with-httpwebresponse
                    StringBuilder sb = new StringBuilder();
                    Byte[] buf = new byte[8192];
                    Stream resStream = response.GetResponseStream();
                    string tmpString = null;
                    int count = 0;
                    do
                    {
                        count = resStream.Read(buf, 0, buf.Length);
                        if (count != 0)
                        {
                            tmpString = Encoding.UTF8.GetString(buf, 0, count);
                            sb.Append(tmpString);
                        }
                        Thread.Sleep(10);
                    } while (count > 0);
                    data = sb.ToString();
                    //--
                }

                //---
                //修正當SYCG沒插KEY時雖然API會有回應,但是回應內容會是亂碼非JSON格式,導致系統死當問題
                if (data.Substring(0, 1) != "{" && data.Substring(data.Length-1, 1) != "}")
                {
                    data = "{\"Ans\":\"Error\"}";
                    MessageBox.Show(Language.m_StrAPIMsg01, Language.m_StrAPIMsg00, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                //---修正當SYCG沒插KEY時雖然API會有回應,但是回應內容會是亂碼非JSON格式,導致系統死當問題
                response.Close();
                //---
                //手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
                request.Abort();
                response = null;
                request = null;
                GC.Collect();//手動記憶體回收
                //---手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
            }
            catch (Exception e)
            {
                data = "{\"Ans\":\"Error\"}";
                data += e.Message;
            }

            if (SYCGV098.m_blnlogfile)//記錄所有V09_API呼叫log
            {
                FileLib.logFile(DateTime.Now.ToString("yyyyMMdd") + ".log", SYCGV098.m_StrAPIName + ":" + data1 + ";" + data);
            }
            return data;
        }

        public static String RESTfulAPI_putBody(String url, String data1)
        {
            String data;
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                setHttpGAPIHeader(ref request);
                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 = "PUT";

                //--
                //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()]
                //--


                //---
                //修改 HTTP PUT 寫入HEADER資訊 
                int myStringCount = 0;
                int intAddCount = 0;
                for (int i = 0; i < data1.Length; i++)
                {
                    byte[] tIntByte = Encoding.Default.GetBytes(data1.Substring(i, 1));

                    // 中文字
                    if (tIntByte.Length == 2)
                    {
                        //To Do Something
                        intAddCount++;
                    }

                    myStringCount += tIntByte.Length;
                }
                if(myStringCount!= data1.Length)
                {
                    request.ContentLength = myStringCount + intAddCount;
                }
                else
                {
                    request.ContentLength = myStringCount;
                }
                
                StreamWriter writer = new StreamWriter(request.GetRequestStream());//CS2PHPrestfulapi 傳送全部改為UTF8
                writer.Write(data1);
                writer.Flush();
                /*
                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(data1);
                    streamWriter.Flush();
                }
                */
                //---修改 HTTP PUT 寫入HEADER資訊
                 
                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));
                data = reader.ReadToEnd();

                //---
                //修正當SYCG沒插KEY時雖然API會有回應,但是回應內容會是亂碼非JSON格式,導致系統死當問題
                if (data.Substring(0, 1) != "{" && data.Substring(data.Length - 1, 1) != "}")
                {
                    data = "{\"Ans\":\"Error\"}";
                    MessageBox.Show(Language.m_StrAPIMsg01, Language.m_StrAPIMsg00, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                //---修正當SYCG沒插KEY時雖然API會有回應,但是回應內容會是亂碼非JSON格式,導致系統死當問題
                response.Close();
                //---
                //手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
                request.Abort();
                response = null;
                request = null;
                GC.Collect();//手動記憶體回收
                //---手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
            }
            catch (Exception e)
            {
                data = "{\"Ans\":\"Error\"}";
                data += e.Message;
            }

            if (SYCGV098.m_blnlogfile)//記錄所有V09_API呼叫log
            {
                FileLib.logFile(DateTime.Now.ToString("yyyyMMdd") + ".log", SYCGV098.m_StrAPIName + ":" + data1 + ";" + data);
            }
            return data;
        }

        public static String RESTfulAPI_delBody(String url, String data1)
        {
            String data;
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                setHttpGAPIHeader(ref request);
                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 = "DELETE";

                //--
                //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(), Encoding.ASCII);//CS2PHPrestfulapi 傳送全部改為UTF8
                //writer.Write(data1);
                //writer.Flush();
                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(data1);
                    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));
                data = reader.ReadToEnd();

                //---
                //修正當SYCG沒插KEY時雖然API會有回應,但是回應內容會是亂碼非JSON格式,導致系統死當問題
                if (data.Substring(0, 1) != "{" && data.Substring(data.Length-1, 1) != "}")
                {
                    data = "{\"Ans\":\"Error\"}";
                    MessageBox.Show(Language.m_StrAPIMsg01, Language.m_StrAPIMsg00, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                //---修正當SYCG沒插KEY時雖然API會有回應,但是回應內容會是亂碼非JSON格式,導致系統死當問題
                response.Close();
                //---
                //手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
                request.Abort();
                response = null;
                request = null;
                GC.Collect();//手動記憶體回收
                //---手動強制執行當呼叫完 CG API 的強制關閉連線補強措施
            }
            catch (Exception e)
            {
                data = "{\"Ans\":\"Error\"}";
                data += e.Message;
            }

            if (SYCGV098.m_blnlogfile)//記錄所有V09_API呼叫log
            {
                FileLib.logFile(DateTime.Now.ToString("yyyyMMdd") + ".log", SYCGV098.m_StrAPIName + ":" + data1 + ";" + data);
            }
            return data;
        }
    }
}


03.PHP API

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;

/*
//http://www.myhow2.net/wp/2012/09/c-visual-studio-2010%E4%B8%AD%E6%B2%A1%E4%BB%80%E4%B9%88%E6%89%BE%E4%B8%8D%E5%88%B0httputility-urlencode%E6%96%B9%E6%B3%95/
原因:Visual Studio 2010中建立的新项目,默认的编译目标平台是”.NET Framework 4.0 Client Profile”, 这个配置没有包含System.Web assembly

解决方法:把编译目标平台改成“.NET Framework 4.0”,然后到Reference里把System.Web Assembly 添加上。

Project -> Properties -> Application -> Target Framework
*/
using System.Web;
using System.Net;
using System.IO;//CookieContainer

namespace SYWEB_V8_Workstation
{
    public class CS_PHP
    {
        public String m_StrDomain;
        public String m_StrUsername;
        public String m_StrPassword;
        public String m_StrResponse;
        private CookieContainer m_CookieContainer;
        public CS_PHP()
        {
            m_StrDomain = "http://192.168.1.78:81/";//m_StrDomain = "http://localhost:8080/cs2php/";
            m_StrUsername = "admin";
            m_StrPassword = "admin";
            m_StrResponse = "";
            m_CookieContainer = new CookieContainer();
        }
        public String loginPHP(String PHPName, String StrUserName,bool blnALLData=false)
        {
            string url = m_StrDomain + PHPName;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            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.CookieContainer = m_CookieContainer;

            //--
            //string data = "username=" + HttpUtility.UrlEncode(user) + "&password=" + HttpUtility.UrlEncode(pass);//一般POST
            string data = String.Format("\"account\":\"{0}\"", StrUserName);//POST to AJAX [is_ajax_request()]
            if (blnALLData == false)
            {
                data = "{" + data + "}";//POST to AJAX [is_ajax_request()]
            }
            else
            {
                data = StrUserName;
            }
            //--

            request.ContentLength = data.Length;
            try
            {
                StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII);
                writer.Write(data);
                writer.Flush();
                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));
                data = reader.ReadToEnd();

                m_CookieContainer = request.CookieContainer;
                response.Close();
            }
            catch
            {
                data = "{\"result\":false}";
            }
            /*
            //檢查Cookies用
            var uri = new Uri(url);
            foreach (var cookie in m_CookieContainer.GetCookies(uri))
            {
                String Data=cookie.ToString(); // test=testValue
            }
            //*/

            return data;
        }
        public String loginPHP(String PHPName, String StrUserName, String StrPassword)
        {
            string url = m_StrDomain + PHPName;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            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.CookieContainer = m_CookieContainer;
            string user = StrUserName; //用户名
            string pass = StrPassword; //密码

            //--
            //string data = "username=" + HttpUtility.UrlEncode(user) + "&password=" + HttpUtility.UrlEncode(pass);//一般POST
            string data = String.Format("\"account\":\"{0}\", \"password\":\"{1}\"", StrUserName, StrPassword);//POST to AJAX [is_ajax_request()]
            data = "{" + data + "}";//POST to AJAX [is_ajax_request()]
            //--

            request.ContentLength = data.Length;
            StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII);
            writer.Write(data);
            writer.Flush();
            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));
            data = reader.ReadToEnd();

            m_CookieContainer = request.CookieContainer;
            response.Close();

            return data;
        }

        public String runPHP(String PHPName)
        {
            string url = m_StrDomain + PHPName;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            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.CookieContainer = m_CookieContainer;
            string data;

            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));
            data = reader.ReadToEnd();

            m_CookieContainer = request.CookieContainer;
            response.Close();

            return data;
        }

        public String runPHP(String PHPName, string StrData)//POST to AJAX [is_ajax_request()]
        {
            string url = m_StrDomain + PHPName;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            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.CookieContainer = m_CookieContainer;
            string data;

            data = StrData;

            byte[] bytes = Encoding.UTF8.GetBytes(data);//http://blog.csdn.net/jiankunking/article/details/17992705
            request.ContentLength = bytes.Length;

            try
            {
                Stream reqStream = request.GetRequestStream();
                reqStream.Write(bytes, 0, bytes.Length);
                reqStream.Close();
                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));
                data = reader.ReadToEnd();

                m_CookieContainer = request.CookieContainer;
                response.Close();
            }
            catch
            {
                data = "{\"result\":false}";
            }

            return data;
        }

        /*
        public String runPHP(String PHPName, String StrData, bool blnRAW = false)//傳統HTTP POST傳送資料
        {
            string url = m_StrDomain + PHPName;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.CookieContainer = m_CookieContainer;

            string data = "";
            if (!blnRAW)
            {
                data = "data=" + HttpUtility.UrlEncode(StrData);//vs $_POST['data'];
            }
            else
            {
                data = HttpUtility.UrlEncode(StrData);//vs file_get_contents("php://input");
            }
            request.ContentLength = data.Length;
            StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII);
            writer.Write(data);
            writer.Flush();
            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));
            data = reader.ReadToEnd();

            m_CookieContainer = request.CookieContainer;
            response.Close();

            return data;
        }
        */

    }
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *