標籤:serial name blank min 請求 head post public des
原文地址:http://blog.laofu.online/2017/06/10/how-js-controlApp/背景
假設有這樣一個產品,一個web和一個winform用戶端,在客戶在web的網頁上面點擊啟動用戶端來處理,這個時候開始調用本地的用戶端,來完成指定的工作。這種情境在日常的上網中也比較常見,如使用迅雷下載。當然實現的方式也有很多種,今天我來示範一種用監控Http請求來實現這個功能,思路如下:
HttpListener
對於上面的分析,最重要的功能雖實現對Http的監控,而.net中已經封裝了我們的需求,下面看下如何具體的實現:
static void Main(string[] args){ HttpListener listerner = new HttpListener(); try { listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身分識別驗證 Anonymous匿名訪問 listerner.Prefixes.Add("http://localhost:8080/Service/"); listerner.Start(); } catch (Exception ex) { Console.WriteLine("無法啟動監視:" + ex.Message); } Task.Factory.StartNew(() => //使用一個線程對監聽 { while (true) { HttpListenerContext ctx = listerner.GetContext(); Task.Factory.StartNew(TaskProc, ctx);//回呼函數,開啟新線程進行調用,不影響下次監聽 } }); Console.ReadKey(); }
實現請求的響應
現在我們可以拿到請求的內容相關的資訊ctx,先定義一個參數的格式,簡單的定義如下:
public class ReciveInfo { public string path { get; set; }//應用程式所在的路徑 public string name { get; set; }//應用程式名稱 }
下面對ctx的Response資料進行填寫.
static void TaskProc(object o) { HttpListenerContext ctx = (HttpListenerContext)o; StreamWriter writer = new StreamWriter(ctx.Response.OutputStream, Encoding.UTF8); try { //接收POST參數 Stream stream = ctx.Request.InputStream; StreamReader reader = new StreamReader(stream, Encoding.UTF8); String body = HttpUtility.UrlDecode(reader.ReadToEnd()); Console.WriteLine(body); var reciveInfo = Json.JsonParser.Deserialize<ReciveInfo>(body); Process.Start(reciveInfo.path); ctx.Response.Headers.Add("Access-Control-Allow-Origin","*"); //防止出現跨域的問題錯誤 ctx.Response.StatusCode = 200; //設定返回給客服端http狀態碼 writer.Write(reciveInfo.name + "啟動成功"); } catch (ArgumentException e) { ctx.Response.StatusCode = 500; writer.Write("參數有誤:" + e.Message); } catch (Exception e) { ctx.Response.StatusCode = 500; writer.Write("程式異常:" + e.Message); } finally { writer.Close(); ctx.Response.Close(); } }
測試
在測試中我在js中啟動我電腦中的QQ,具體的代碼如下:
<button id="btnQQ"> start QQ</button> <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script type="text/javascript"> $(function() { $("#btnQQ").click(function() { $.ajax({ type: "POST", url: "http://localhost:8080/Service", dataType: "json", data: JSON.stringify({ path: "D:/Program Files/Tencent/QQ/Bin/QQScLauncher.exe", name: "qq" }) }); }); }); </script>
啟動後,運行如下:
第45篇 js操作開啟本地程式