http 非同步 接收 回傳 資料文字和檔案流
阿新 • • 發佈:2018-11-07
public void HttpListenerStar() { try { HttpListener httpListener = new HttpListener(); httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous; httpListener.Prefixes.Add("http://+:8080/"); httpListener.Start(); httpListener.BeginGetContext(new AsyncCallback(GetContextCallBack), httpListener); } catch (Exception ex) { writeLog(ex.ToString()); } } private void GetContextCallBack(IAsyncResult ar) { System.Net.HttpListener listerner= ar.AsyncState as System.Net.HttpListener; HttpListenerContext requestContext = listerner.EndGetContext(ar); try { Thread th = new Thread(new ThreadStart(delegate { HttpListenerDataParsing(requestContext); })); th.Start(); }catch (Exception ex) { try { requestContext.Response.StatusCode = 500; requestContext.Response.ContentType = "text/html"; requestContext.Response.ContentEncoding = Encoding.UTF8; byte[] buffer = System.Text.Encoding.UTF8.GetBytes("System Error"); //對客戶端輸出相應資訊. requestContext.Response.ContentLength64 = buffer.Length; System.IO.Stream output = requestContext.Response.OutputStream; output.Write(buffer, 0, buffer.Length); //關閉輸出流,釋放相應資源 output.Close(); } catch (Exception ee) { writeLog(ee.ToString()); } } listerner.BeginGetContext(new AsyncCallback(GetContextCallBack), listerner); } private void HttpListenerDataParsing(HttpListenerContext request) { byte[] content_to_bytes = null; try { string RawUrl = request.Request.RawUrl; writeLog(DateTime.Now + "\r\n" + RawUrl); string refData = ""; String ip = request.Request.RemoteEndPoint.Address.ToString(); if (ipTable.ContainsKey(ip) || (ip.Length > 10 && ip.Substring(0, 10) == "192.168.1.")) { string type = HttpUtility.ParseQueryString(RawUrl.Substring(1, RawUrl.Length - 1))["type"]; //不要問我問什麼要減1 ,我特麼也不知道為什麼加了一斜槓就解析不出來了 string time = HttpUtility.ParseQueryString(RawUrl.Substring(1, RawUrl.Length - 1))["time"]; string sign = HttpUtility.ParseQueryString(RawUrl.Substring(1, RawUrl.Length - 1))["sign"]; if (type == "get") { refData= Encoding.UTF8.GetBytes("ok"); } else if (type == "down") { if (time != null && time != "" && sign != null && sign != "") { string voiceName = Path.Combine(voicePath, time, sign); if (!File.Exists(voiceName)) voiceName = "1243.txt"; using (FileStream reader = new FileStream(voiceName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { request.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(sign, System.Text.Encoding.UTF8)); request.Response.ContentType = "application/octet-stream"; request.Response.StatusCode = 200; request.Response.Headers.Add("Access-Control-Allow-Origin", "*"); request.Response.ContentEncoding = Encoding.UTF8; request.Response.ContentLength64 = reader.Length; var output = request.Response.OutputStream; int length = (int)reader.Length; byte[] pReadByte = new byte[length]; int read = 0; //斷點發送 在這裡判斷設定reader.Position即可 while ((read = reader.Read(pReadByte, 0, length)) != 0) { output.Write(pReadByte, 0, read); } output.Close(); reader.Close(); } return; } } } else { refData = "Not is iptable"; } content_to_bytes = Encoding.UTF8.GetBytes(refData); request.Response.ContentType = "application/json"; request.Response.StatusCode = 200; request.Response.Headers.Add("Access-Control-Allow-Origin", "*"); request.Response.ContentEncoding = Encoding.UTF8; request.Response.ContentLength64 = content_to_bytes.Length; var output1 = request.Response.OutputStream; output1.Write(content_to_bytes, 0, content_to_bytes.Length); output1.Close(); } catch (Exception ex) { writeLog(ex.ToString()); } }