具體運用場景是這樣的,在網頁上通過調用客戶端的設備來實現拍照或錄入指紋等這樣的操作。本來硬件設備是肯定會提供js腳本驅動的,但由於某些原因,硬件的驅動的二次開發都是用winfrom程序做的,所以就要求在網頁中調用exe並獲取拍照的結果。 網上介紹的多的方式有兩種,一種是修改注冊表,然后通過超鏈接的形式調用,還有一種就是用ActiveXObject,然后只能ie瀏覽器能用。這兩種方式想要獲得exe的運行結果都很麻煩。 我現在用的方法是通過exe程序監聽本地的端口,然后在網頁中像調用API那樣去調用exe從而獲得返回結果。
以C#為例:
private void LessionHttp(object lineCount){ HttpListener listerner = new HttpListener(); while (true){ try { listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份驗證 Anonymous匿名訪問 listerner.Prefixes.Add("http://127.0.0.1:7070/api/GetIdCard/"); listerner.Prefixes.Add("http://127.0.0.1:7070/api/GetImages/"); listerner.Start(); } catch (Exception ex) { ShowLog("服務啟動失敗...");//這個ShowLog只是顯示信息,可以用自己的方法代替 break; } ShowLog("服務器啟動成功......."); int minThreadNum; int portThreadNum; int maxThreadNum; ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum); ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum); ShowLog(string.Format("最大線程數:{0}", maxThreadNum)); ShowLog(string.Format("最小空閑線程數:{0}", minThreadNum)); ShowLog("\n\n等待客戶連接中。。。。"); while (true){ //等待請求連接 //沒有請求則GetContext處於阻塞狀態 HttpListenerContext ctx = listerner.GetContext(); ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc), ctx); } //listerner.Stop(); } //Console.ReadKey(); }
private void TaskProc(object o){ HttpListenerContext ctx = (HttpListenerContext)o; ctx.Response.StatusCode = 200;//設置返回給客服端http狀態代碼 //接收Get參數 string type = ctx.Request.QueryString["type"]; string userId = ctx.Request.QueryString["act"]; //string filename = Path.GetFileName(ctx.Request.RawUrl); //接收POST參數 Stream stream = ctx.Request.InputStream; MeWin.mActionType = ctx.Request.RawUrl.Replace("api/","").Replace("/",""); ShowLog("調用設備:" + MeWin.mActionType); StreamReader reader = new StreamReader(stream, Encoding.UTF8); string body = reader.ReadToEnd(); ShowLog("收到POST數據:" + HttpUtility.UrlDecode(body)); string mCapturePoint= HttpUtility.ParseQueryString(body).Get("capturePoint"); string mImageFormat = HttpUtility.ParseQueryString(body).Get("imageFormat"); ShowLog("capturePoint:" + mCapturePoint); ShowLog("imageFormat:" +mImageFormat ); BeginWork();//這里獲取到網頁端傳遞的參數后,開始exe的工作 while (!MeWin.isEnd) { }//讓這個線程一直在這里等着,等待exe執行完成,exe執行完成后修改MeWin.isEnd的值來通知這個線程繼續 MeWin.isEnd = false; //使用Writer輸出http響應代碼,UTF8格式 using (StreamWriter writer = new StreamWriter(ctx.Response.OutputStream, Encoding.UTF8)) { ShowLog("用戶操作完成"); writer.Write(MeWin.Result);//這里就是返回給網頁的結果,返回內容是什么,就隨你了 MeWin.Result = ""; writer.Close(); ctx.Response.Close(); } }
上面兩段代碼主要是exe程序的,下面再看看網頁中如何調用
function post(URL, PARAMS) { var temp = document.createElement("form"); temp.action = URL; temp.method = "post"; temp.style.display = "none"; for (var x in PARAMS) { var opt = document.createElement("textarea"); opt.name = x; opt.value = PARAMS[x]; // alert(opt.name) temp.appendChild(opt); } document.body.appendChild(temp); temp.submit(); return temp; } function fff() { post('http://127.0.0.1:7070/api/GetIdCard', { imageFormat: '1' }); } 在網頁中執行fff函數就可以了