主頁 > .NET開發 > [C#] 折騰海康威視的人體測溫 模組

[C#] 折騰海康威視的人體測溫 模組

2020-09-14 09:13:56 .NET開發

單位的專案需要測溫,同事買了個海康威視的人體測溫機芯,型號位:TB-4117-3/S,給了一份pdf的說明書,

按說明書把設備連接設定好,從官網下載了sdk,我的個乖乖,壓縮包就有70多M,把他家的所有東西都給了我,有各種Demo,就是沒有測溫的,暈死,差點想打退堂鼓不玩了,

最后,最后得到如下成果:

一、所需的DLL

  1. HCCore.dll
  2. HCCoreDevCfg.dll 這玩意必須在運行目錄
  3. HCGeneralCfgMgr.dll 這鬼也必須在運行目錄
  4. HCNetSDK.dll
  5. libeay32.dll
  6. ssleay32.dll
    以上6個檔案必須的,干啥用俺也不知道,反正缺一不可,

二、委托、dll封裝、資料結果


        public delegate void LOGINRESULTCALLBACK(int lUserID, int dwResult, IntPtr lpDeviceInfo, IntPtr pUser);
        public delegate void UpdateTextStatusCallback(string strLogStatus, IntPtr lpDeviceInfo);
        public delegate void RemoteConfigCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData);


        #region DllWrapper
        const string DllFileName = "HCNetSDK.dll";
        [DllImport(DllFileName)]
        public static extern bool NET_DVR_Init();
        [DllImport(DllFileName)]
        public static extern int NET_DVR_Login_V40(ref NET_DVR_USER_LOGIN_INFO pLoginInfo, ref NET_DVR_DEVICEINFO_V40 lpDeviceInfo);
        [DllImportAttribute(DllFileName)]
        public static extern int NET_DVR_StartRemoteConfig(int lUserID, int dwCommand, IntPtr lpInBuffer, Int32 dwInBufferLen, RemoteConfigCallback cbStateCallback, IntPtr pUserData);
        [DllImport(DllFileName)]
        public static extern bool NET_DVR_Logout(int iUserID);
        [DllImport(DllFileName)]
        public static extern bool NET_DVR_Cleanup();
        [DllImport(DllFileName)]
        public static extern uint NET_DVR_GetLastError();
        #endregion

        #region Data

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_THERMOMETRY_UPLOAD
        {
            public uint dwSize;
            public uint dwRelativeTime;     // 相對時標
            public uint dwAbsTime;            // 絕對時標
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)]
            public byte[] szRuleName;//規則名稱
            public byte byRuleID;//規則ID號
            public byte byRuleCalibType;//規則標定型別 0-點,1-框,2-線
            public ushort wPresetNo; //預置點號
            [MarshalAs(UnmanagedType.Struct)]
            public NET_DVR_POINT_THERM_CFG struPointThermCfg;
            [MarshalAs(UnmanagedType.Struct)]

            public NET_DVR_LINEPOLYGON_THERM_CFG struLinePolygonThermCfg;
            public byte byThermometryUnit;//測溫單位: 0-攝氏度(℃),1-華氏度(℉),2-開爾文(K)
            public byte byDataType;//資料狀態型別:0-檢測中,1-開始,2-結束
            public byte byRes1;
            /*
            bit0-中心點測溫:0-不支持,1-支持;
            bit1-最高點測溫:0-不支持,1-支持;
            bit2-最低點測溫:0-不支持,1-支持;
            */
            public byte bySpecialPointThermType;// 是否支持特殊點測溫
            public float fCenterPointTemperature;//中心點溫度,精確到小數點后一位(-40-1500),(浮點數+100)*10 (由bySpecialPointThermType判斷是否支持中心點)
            public float fHighestPointTemperature;//最高點溫度,精確到小數點后一位(-40-1500),(浮點數+100)*10(由bySpecialPointThermType判斷是否支持最高點)
            public float fLowestPointTemperature;//最低點溫度,精確到小數點后一位(-40-1500),(浮點數+100)*10(由bySpecialPointThermType判斷是否支持最低點)
            [MarshalAs(UnmanagedType.Struct)]
            public NET_VCA_POINT struHighestPoint;//線、框測溫最高溫度位置坐標(當規則標定型別為線、框的時候生效)
            [MarshalAs(UnmanagedType.Struct)]
            public NET_VCA_POINT struLowestPoint;//線、框測溫最低溫度位置坐標(當規則標定型別為線、框的時候生效)
            public byte byIsFreezedata;//是否資料凍結 0-否 1-是
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;
            public uint dwChan; //通道號,查詢條件中通道號為0xffffffff時該欄位生效
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 88, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_POINT_THERM_CFG
        {
            public float fTemperature;
            public NET_VCA_POINT struPoint;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 120, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;

        }

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_LINEPOLYGON_THERM_CFG
        {
            public float fMaxTemperature;
            public float fMinTemperature;
            public float fAverageTemperature;
            public float fTemperatureDiff;
            public NET_VCA_POLYGON struRegion;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes;
        }
        public const int VCA_MAX_POLYGON_POINT_NUM = 10;//檢測區域最多支持10個點的多邊形

        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_VCA_POLYGON
        {
            /// DWORD->unsigned int
            public uint dwPointNum;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = VCA_MAX_POLYGON_POINT_NUM, ArraySubType = UnmanagedType.Struct)]
            public NET_VCA_POINT[] struPos;
        }
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_VCA_POINT
        {
            public float fX;// X軸坐標, 0.001~1
            public float fY;//Y軸坐標, 0.001~1
        }



        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_REALTIME_THERMOMETRY_COND
        {
            public uint dwSize;
            public uint dwChan;//通道號,從1開始,0xffffffff代表獲取全部通道
            public byte byRuleID; //規則ID 0-代表獲取全部規則,具體規則ID從1開始 
            /*
            1-定時模式:設備每隔一秒上傳各個規則測溫資料的最高溫、最低溫和平均溫度值、溫差
            2-溫差模式:若上一秒與下一秒的最高溫或者最低溫或者平均溫或者溫差值的溫差大于等于2攝氏度,則上傳最高溫、最低溫和平均溫度值,若大于等于一個小時溫差值均小于2攝氏度,則上傳最高溫、最低溫、平均溫和溫差值
            */
            public byte byMode; //長連接模式, 0-保留(為兼容老設備),1-定時模式,2-溫差模式
            public ushort wInterval; //上傳間隔,僅溫差模式支持,1~3600S,填0則默認3600S上傳一次
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 60, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes; //保留
        }
        public const int NET_DVR_DEV_ADDRESS_MAX_LEN = 129;
        public const int NET_DVR_LOGIN_USERNAME_MAX_LEN = 64;
        public const int NET_DVR_LOGIN_PASSWD_MAX_LEN = 64;

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_USER_LOGIN_INFO
        {
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NET_DVR_DEV_ADDRESS_MAX_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sDeviceAddress;
            public byte byUseTransport;
            public ushort wPort;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NET_DVR_LOGIN_USERNAME_MAX_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sUserName;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NET_DVR_LOGIN_PASSWD_MAX_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sPassword;
            public LOGINRESULTCALLBACK cbLoginResult;
            public IntPtr pUser;
            public bool bUseAsynLogin;
            public byte byProxyType; //0:不使用代理,1:使用標準代理,2:使用EHome代理
            public byte byUseUTCTime;    //0-不進行轉換,默認,1-介面上輸入輸出全部使用UTC時間,SDK完成UTC時間與設備時區的轉換,2-介面上輸入輸出全部使用平臺本地時間,SDK完成平臺本地時間與設備時區的轉換
            public byte byLoginMode; //0-Private, 1-ISAPI, 2-自適應
            public byte byHttps;    //0-不適用tls,1-使用tls 2-自適應
            public int iProxyID;    //代理服務器序號,添加代理服務器資訊時,相對應的服務器陣列下表值
            public byte byVerifyMode;  //認證方式,0-不認證,1-雙向認證,2-單向認證;認證僅在使用TLS的時候生效;    
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 119, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes3;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct NET_DVR_DEVICEINFO_V40
        {
            public NET_DVR_DEVICEINFO_V30 struDeviceV30;
            public byte bySupportLock;        //設備支持鎖定功能,該欄位由SDK根據設備回傳值來賦值的,bySupportLock為1時,dwSurplusLockTime和byRetryLoginTime有效
            public byte byRetryLoginTime;	    //剩余可嘗試登陸的次數,用戶名,密碼錯誤時,此引數有效
            public byte byPasswordLevel;      //admin密碼安全等級0-無效,1-默認密碼,2-有效密碼,3-風險較高的密碼,當用戶的密碼為出廠默認密碼(12345)或者風險較高的密碼時,上層客戶端需要提示用戶更改密碼,      
            public byte byProxyType;//代理型別,0-不使用代理, 1-使用socks5代理, 2-使用EHome代理
            public uint dwSurplusLockTime;	//剩余時間,單位秒,用戶鎖定時,此引數有效
            public byte byCharEncodeType;     //字符編碼型別
            public byte bySupportDev5;//支持v50版本的設備引數獲取,設備名稱和設備型別名稱長度擴展為64位元組
            public byte bySupport;  //能力集擴展,位與結果:0- 不支持,1- 支持
            // bySupport & 0x1:  保留
            // bySupport & 0x2:  0-不支持變化上報 1-支持變化上報
            public byte byLoginMode; //登錄模式 0-Private登錄 1-ISAPI登錄
            public int dwOEMCode;
            public int iResidualValidity;   //該用戶密碼剩余有效天數,單位:天,回傳負值,表示密碼已經超期使用,例如“-3表示密碼已經超期使用3天”
            public byte byResidualValidity; // iResidualValidity欄位是否有效,0-無效,1-有效
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 243, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;
        }

        public const int SERIALNO_LEN = 48;//序列號長度

        //NET_DVR_Login_V30()引數結構
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct NET_DVR_DEVICEINFO_V30
        {
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)]
            public byte[] sSerialNumber;  //序列號
            public byte byAlarmInPortNum;		        //報警輸入個數
            public byte byAlarmOutPortNum;		        //報警輸出個數
            public byte byDiskNum;				    //硬碟個數
            public byte byDVRType;				    //設備型別, 1:DVR 2:ATM DVR 3:DVS ......
            public byte byChanNum;				    //模擬通道個數
            public byte byStartChan;			        //起始通道號,例如DVS-1,DVR - 1
            public byte byAudioChanNum;                //語音通道數
            public byte byIPChanNum;					//最大數字通道個數,低位  
            public byte byZeroChanNum;			//零通道編碼個數 //2010-01-16
            public byte byMainProto;			//主碼流傳輸協議型別 0-private, 1-rtsp,2-同時支持private和rtsp
            public byte bySubProto;				//子碼流傳輸協議型別0-private, 1-rtsp,2-同時支持private和rtsp
            public byte bySupport;        //能力,位與結果為0表示不支持,1表示支持,
                                          //bySupport & 0x1, 表示是否支持智能搜索
                                          //bySupport & 0x2, 表示是否支持備份
                                          //bySupport & 0x4, 表示是否支持壓縮引數能力獲取
                                          //bySupport & 0x8, 表示是否支持多網卡
                                          //bySupport & 0x10, 表示支持遠程SADP
                                          //bySupport & 0x20, 表示支持Raid卡功能
                                          //bySupport & 0x40, 表示支持IPSAN 目錄查找
                                          //bySupport & 0x80, 表示支持rtp over rtsp
            public byte bySupport1;        // 能力集擴充,位與結果為0表示不支持,1表示支持
                                           //bySupport1 & 0x1, 表示是否支持snmp v30
                                           //bySupport1 & 0x2, 支持區分回放和下載
                                           //bySupport1 & 0x4, 是否支持布防優先級	
                                           //bySupport1 & 0x8, 智能設備是否支持布防時間段擴展
                                           //bySupport1 & 0x10, 表示是否支持多磁盤數(超過33個)
                                           //bySupport1 & 0x20, 表示是否支持rtsp over http	
                                           //bySupport1 & 0x80, 表示是否支持車牌新報警資訊2012-9-28, 且還表示是否支持NET_DVR_IPPARACFG_V40結構體
            public byte bySupport2; /*能力,位與結果為0表示不支持,非0表示支持							
							bySupport2 & 0x1, 表示解碼器是否支持通過URL取流解碼
							bySupport2 & 0x2,  表示支持FTPV40
							bySupport2 & 0x4,  表示支持ANR
							bySupport2 & 0x8,  表示支持CCD的通道引數配置
							bySupport2 & 0x10,  表示支持布防報警回傳資訊(僅支持抓拍機報警 新老報警結構)
							bySupport2 & 0x20,  表示是否支持單獨獲取設備狀態子項
							bySupport2 & 0x40,  表示是否是碼流加密設備*/
            public ushort wDevType;              //設備型號
            public byte bySupport3; //能力集擴展,位與結果為0表示不支持,1表示支持
                                    //bySupport3 & 0x1, 表示是否多碼流
                                    // bySupport3 & 0x4 表示支持按組配置, 具體包含 通道影像引數、報警輸入引數、IP報警輸入、輸出接入引數、
                                    // 用戶引數、設備作業狀態、JPEG抓圖、定時和時間抓圖、硬碟盤組管理 
                                    //bySupport3 & 0x8為1 表示支持使用TCP預覽、UDP預覽、多播預覽中的"延時預覽"欄位來請求延時預覽(后續都將使用這種方式請求延時預覽),而當bySupport3 & 0x8為0時,將使用 "私有延時預覽"協議,
                                    //bySupport3 & 0x10 表示支持"獲取報警主機主要狀態(V40)",
                                    //bySupport3 & 0x20 表示是否支持通過DDNS域名決議取流

            public byte byMultiStreamProto;//是否支持多碼流,按位表示,0-不支持,1-支持,bit1-碼流3,bit2-碼流4,bit7-主碼流,bit-8子碼流
            public byte byStartDChan;		//起始數字通道號,0表示無效
            public byte byStartDTalkChan;	//起始數字對講通道號,區別于模擬對講通道號,0表示無效
            public byte byHighDChanNum;		//數字通道個數,高位
            public byte bySupport4;
            public byte byLanguageType;// 支持語種能力,按位表示,每一位0-不支持,1-支持  
                                       //  byLanguageType 等于0 表示 老設備
                                       //  byLanguageType & 0x1表示支持中文
                                       //  byLanguageType & 0x2表示支持英文
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 9, ArraySubType = UnmanagedType.I1)]
            public byte[] byRes2;		//保留
        }

        #endregion

三、測溫

 const string IPAddress = "192.168.1.64";
        const string UserName = "admin";
        const string Password = "13245678";
        const ushort PortNo = 8000;
        static void Main(string[] args)
        {
            //初始化
            if (!NET_DVR_Init())
            {
                Console.WriteLine("NET_DVR_Init error!");
                return;
            }
            //登陸
            var struLogInfo = new NET_DVR_USER_LOGIN_INFO();

            //設備IP地址或者域名
            byte[] byIP = System.Text.Encoding.Default.GetBytes(IPAddress);
            struLogInfo.sDeviceAddress = new byte[129];
            byIP.CopyTo(struLogInfo.sDeviceAddress, 0);

            //設備用戶名
            byte[] byUserName = System.Text.Encoding.Default.GetBytes(UserName);
            struLogInfo.sUserName = new byte[64];
            byUserName.CopyTo(struLogInfo.sUserName, 0);

            //設備密碼
            byte[] byPassword = System.Text.Encoding.Default.GetBytes(Password);
            struLogInfo.sPassword = new byte[64];
            byPassword.CopyTo(struLogInfo.sPassword, 0);

            struLogInfo.wPort = PortNo;//設備服務埠號

            struLogInfo.bUseAsynLogin = false; //是否異步登錄:0- 否,1- 是 

            var DeviceInfo = new NET_DVR_DEVICEINFO_V40();

            //登錄設備 Login the device
            var m_lUserID = NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);
            if (m_lUserID < 0)
            {
                Console.WriteLine("登陸失敗,錯誤代碼:" + NET_DVR_GetLastError()); //登錄失敗,輸出錯誤號
                return;
            }


            //配置測溫
            var size = Marshal.SizeOf(typeof(NET_DVR_REALTIME_THERMOMETRY_COND));

            NET_DVR_REALTIME_THERMOMETRY_COND struThermCond = new NET_DVR_REALTIME_THERMOMETRY_COND();
            struThermCond.dwSize = (uint)size;
            struThermCond.byRuleID = 0;       //規則ID,0代表獲取全部規則,具體規則ID從1開始
            struThermCond.dwChan = 1;// dwChannel; //從1開始,0xffffffff代表獲取全部通道

            IntPtr pCond = Marshal.AllocCoTaskMem(size);
            Marshal.StructureToPtr(struThermCond, pCond, false);
            var ret = NET_DVR_StartRemoteConfig(m_lUserID, 3629, pCond, size, Callback, IntPtr.Zero);
            if (ret < 0)
            {
                Console.WriteLine("配置測溫失敗, 錯誤代碼:" + NET_DVR_GetLastError()); //登錄失敗,輸出錯誤號
                return;
            }

            Console.WriteLine("開始測溫...");
            Console.ReadKey();

            //退出登錄
            NET_DVR_Logout(m_lUserID);

            NET_DVR_Cleanup();


        }
        /// <summary>
        /// 只顯示最高溫度
        /// </summary>
        /// <param name="dwType"></param>
        /// <param name="lpBuffer"></param>
        /// <param name="dwBufLen"></param>
        /// <param name="pUserData"></param>
        static void Callback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
        {
            var ret = Marshal.PtrToStructure<NET_DVR_THERMOMETRY_UPLOAD>(lpBuffer);
            Console.WriteLine(ret.struLinePolygonThermCfg.fMaxTemperature);
        }

哎,就這么點事,弄得很復雜,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/33172.html

標籤:C#

上一篇:記一次排查線上程式記憶體的忽高忽低,又是大集合惹禍了

下一篇:使用Outlook物件篩選的_Items.Restrict方法時,“不支持使用like的模糊查詢”

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more