using Newtonsoft.Json.Linq; using PTMedicalInsurance.Common; using PTMedicalInsurance.Variables; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PTMedicalInsurance.Helper { class InvokeRestCenter : IInvokeCenter { public int Business(string inputData, ref string outputData, ref string pErrMsg) { outputData = ""; pErrMsg = ""; JObject joRtn = new JObject(); try { //创建一个HTTP请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL); //Post请求方式 request.Method = "POST"; //string nonce = Guid.NewGuid().ToString(); //非重复的随机字符串(十分钟内不能重复) //string timestamp = TimeStamp.get13().ToString(); //当前时间戳(秒) //string BusinessID = Global.inf.BusinessID; //服务商ID //string InsuHosID = Global.inf.hospitalNO; //医疗机构ID //string CreditID = Global.inf.CreditID; //服务商统一社会信用代码 //内容类型 request.ContentType = "application/json"; //昆明增加头部信息 //string sTemp = timestamp + BusinessID + nonce; //Sha256 加密生成的签名 signature = sha256(hsf_timestamp + infosyssign + hsf_nonce) //string signature = Encrypt.SHA256EncryptStr(sTemp); //request.Headers.Add("hsf_signature", signature); //request.Headers.Add("hsf_timestamp", timestamp); //request.Headers.Add("hsf_nonce", nonce); //request.Headers.Add("fixmedins_code", InsuHosID); //request.Headers.Add("infosyscode", CreditID); //设置参数,并进行URL编码 string paraUrlCoded = inputData;//System.Web.HttpUtility.UrlEncode(jsonParas); byte[] payload; //将Json字符串转化为字节 payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded); //设置请求的ContentLength request.ContentLength = payload.Length; //发送请求,获得请求流 Stream writer; writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象 //将请求参数写入流 writer.Write(payload, 0, payload.Length); writer.Close();//关闭请求流 // String strValue = "";//strValue为http响应所返回的字符流 HttpWebResponse response = null; try { //获得响应流 response = (HttpWebResponse)request.GetResponse(); } catch (Exception ex) { JsonHelper.setExceptionJson(-99, "centerServeiceInvok中获得响应流异常", ex.Message); return -1; } outputData = getResponseData(response); joRtn = JObject.Parse(outputData);//返回Json数据 if (joRtn.ContainsKey("body")) { joRtn = (JObject)joRtn.GetValue("body"); outputData = JsonHelper.toJsonString(joRtn); } return 0; } catch (Exception ex) { joRtn.Add("infcode", -1); joRtn.Add("err_msg", "调用中心服务异常invokeCenterService(1):" + ex.Message); outputData = JsonHelper.toJsonString(joRtn); return -1; } } public int BusinessExt(string inputData, ref string outputData, ref string pErrMsg) { return this.Business(inputData, ref outputData, ref pErrMsg); } //public int DownloadFile(string inputData, ref string outputData) //{ // outputData = ""; // string error = string.Empty; int errorCode = 0; // try // { // JObject jsonInParam = JObject.Parse(inputData); // // 去除外wrapper层便于通用 // Utils.removeWrapper(jsonInParam); // string fileName = (string)jsonInParam["input"]["fsDownloadIn"]["filename"]; // string filePath = Global.curEvt.path + "\\Download\\" + fileName; // //如果不存在目录,则创建目录 // if (!Directory.Exists(Global.curEvt.path + "\\Download")) // { // //创建文件夹 // DirectoryInfo dirInfo = Directory.CreateDirectory(Global.curEvt.path + "\\Download"); // } // if (File.Exists(filePath)) // { // File.Delete(filePath); // } // FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); // //创建一个HTTP请求 // Global.curEvt.URL = Global.inf.downURL; // HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL); // //Post请求方式 // request.Method = "POST"; // //内容类型 // request.ContentType = "application/json"; // //设置参数,并进行URL编码 // string paraUrlCoded = JsonHelper.toJsonString(jsonInParam); // byte[] payload; // //将Json字符串转化为字节 // payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded); // //设置请求的ContentLength // request.ContentLength = payload.Length; // Stream writer; // try // { // writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象 // } // catch (Exception) // { // writer = null; // errorCode = -100; // error = "连接服务器失败!"; // } // //将请求参数写入流 // writer.Write(payload, 0, payload.Length); // writer.Close();//关闭请求流 // // String strValue = "";//strValue为http响应所返回的字符流 // //发送请求并获取相应回应数据 // HttpWebResponse response = request.GetResponse() as HttpWebResponse; // //直到request.GetResponse()程序才开始向目标网页发送Post请求 // Stream responseStream = response.GetResponseStream(); // //创建本地文件写入流 // byte[] bArr = new byte[1024]; // int iTotalSize = 0; // int size = responseStream.Read(bArr, 0, (int)bArr.Length); // while (size > 0) // { // iTotalSize += size; // fs.Write(bArr, 0, size); // size = responseStream.Read(bArr, 0, (int)bArr.Length); // } // fs.Close(); // responseStream.Close(); // dynamic joReturn = new JObject(); // joReturn.errorCode = errorCode; // joReturn.errorMessage = error; // joReturn.filePath = filePath; // outputData = joReturn.ToString(); // } // catch (Exception ex) // { // errorCode = -100; // error = ex.Message; // dynamic joReturn = new JObject(); // joReturn.errorCode = errorCode; // joReturn.errorMessage = error; // outputData = joReturn.ToString(); // return -1; // } // finally // { // Global.writeLog("DownloadCenterFile" + "(" + Global.curEvt.URL + ")", inputData, outputData); // } // return 0; //} public int DownloadFile(string inputData, ref string outputData) { outputData = ""; string error = string.Empty; int errorCode = 0; try { JObject jsonInParam = JObject.Parse(inputData); Utils.removeWrapper(jsonInParam); string fileName = (string)jsonInParam["input"]["fsDownloadIn"]["filename"]; string filePath = Path.Combine(Global.curEvt.path, "Download", fileName); // 推荐使用 Path.Combine // 创建下载目录 string downloadDir = Path.Combine(Global.curEvt.path, "Download"); if (!Directory.Exists(downloadDir)) { Directory.CreateDirectory(downloadDir); } // 删除已存在的同名文件 if (File.Exists(filePath)) { File.Delete(filePath); } // 设置请求 URL Global.curEvt.URL = Global.inf.downURL; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL); request.Method = "POST"; request.ContentType = "application/json"; // 序列化请求体 string requestBody = JsonHelper.toJsonString(jsonInParam); byte[] payload = Encoding.UTF8.GetBytes(requestBody); request.ContentLength = payload.Length; // 写入请求体 using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(payload, 0, payload.Length); } // 发送请求并获取响应(关键:需要检查响应状态) HttpWebResponse response; try { response = (HttpWebResponse)request.GetResponse(); } catch (WebException webEx) { // 捕获 HTTP 错误(如 400, 500 等) if (webEx.Response is HttpWebResponse errorResponse) { using (Stream errStream = errorResponse.GetResponseStream()) { if (errStream != null) { using (StreamReader reader = new StreamReader(errStream, Encoding.UTF8)) { string errorContent = reader.ReadToEnd(); // 尝试解析为 JSON,否则直接返回文本 try { var errorJson = JObject.Parse(errorContent); error = errorJson["errorMessage"]?.ToString() ?? errorJson["error"]?.ToString() ?? errorContent; } catch { error = $"HTTP {errorResponse.StatusCode}: {errorContent}"; } } } else { error = $"HTTP {errorResponse.StatusCode}: 无法读取错误详情。"; } } errorCode = (int)errorResponse.StatusCode; } else { error = "连接服务器失败: " + webEx.Message; errorCode = -101; } throw new Exception(error); // 触发 catch 块统一处理 } // 只有成功状态才继续下载 if (response.StatusCode != HttpStatusCode.OK) { using (response) { string responseContent; using (Stream resStream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(resStream, Encoding.UTF8)) { responseContent = reader.ReadToEnd(); } error = $"服务器返回非成功状态: {(int)response.StatusCode} {response.StatusCode}\n响应内容: {responseContent}"; errorCode = (int)response.StatusCode; } throw new Exception(error); } // 开始下载文件 using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None)) using (Stream responseStream = response.GetResponseStream()) { byte[] buffer = new byte[4096]; // 建议使用 4KB 缓冲区 int bytesRead; int totalBytesRead = 0; while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0) { fs.Write(buffer, 0, bytesRead); totalBytesRead += bytesRead; } } // 成功返回 dynamic joReturn = new JObject(); joReturn.errorCode = 0; joReturn.errorMessage = ""; joReturn.filePath = filePath; outputData = joReturn.ToString(); return 0; } catch (Exception ex) { if (errorCode == 0) // 防止覆盖前面设置的 errorCode { errorCode = -100; } error = ex.Message; dynamic joReturn = new JObject(); joReturn.errorCode = errorCode; joReturn.errorMessage = error; outputData = joReturn.ToString(); return -1; } finally { Global.writeLog("DownloadCenterFile" + "(" + Global.curEvt.URL + ")", inputData, outputData); } } public int Init(ref string pErrMsg) { return 0; } public int UploadFile(string inputData, ref string outputData, ref string pErrMsg) { throw new NotImplementedException(); } private string getResponseData(HttpWebResponse response) { string data = ""; if (response != null) { Stream s = response.GetResponseStream(); StreamReader sRead = new StreamReader(s); data = sRead.ReadToEnd(); sRead.Close(); response.Close(); } return data; } } }