using System.Net; using System.Text; using Newtonsoft.Json.Linq; namespace MES.Service.service.PLM; #region 1.根据文档物理文件id获取文档流数据 public class WarehouseDownloadDoc { private readonly string _cloudUrl = "http://122.227.249.70:5050/k3cloud"; private readonly string _warehouse = "http://192.168.1.90/CloudPLMWarehouse"; #region 文档服务器上下文 private string WarehouseCTX { get { var json = "{\"ap1\":{ \"AcctID\":\"" + "6654201b47f099" + "\",\"Username\":\"Administrator\",\"Password\":\"Lts88666*\",\"Lcid\":2052,\"AuthenticateType\":1,\"PasswordIsEncrypted\":\"false\",\"ClientInfo\":{\"ClientType\":8}}"; var resp = GetResponse( "http://122.227.249.70:5050/k3cloud/Kingdee.BOS.ServiceFacade.ServicesStub.User.UserService.ValidateLoginInfo.common.kdsvc", json, new Dictionary()); var ret = new StreamReader(resp.GetResponseStream(), Encoding.UTF8) .ReadToEnd(); var result = JObject.Parse(ret)["Context"]; var token = result["UserToken"].ToString(); var warehouseCtx = string.Format("LoginUrl={0}&KDServiceSessionId={1}", _cloudUrl, JObject.Parse(ret)["KDSVCSessionId"]); //安全新方式 return Convert.ToBase64String(Encoding.UTF8.GetBytes(warehouseCtx)); /*string json = "{\"ap1\":{ \"AcctID\":\"" + "6654201b47f099" + "\",\"Username\":\"Administrator\",\"Password\":\"Lts88666*\",\"Lcid\":2052,\"AuthenticateType\":1,\"PasswordIsEncrypted\":\"false\",\"ClientInfo\":{\"ClientType\":8}}"; var resp = GetResponse("http://122.227.249.70:5050/k3cloud/Kingdee.BOS.ServiceFacade.ServicesStub.User.UserService.ValidateLoginInfo.common.kdsvc", json, new Dictionary()); string ret = (new StreamReader(resp.GetResponseStream(), Encoding.UTF8)).ReadToEnd(); var result = JObject.Parse(ret)["Context"]; string token = result["UserToken"].ToString(); var warehouseCtx = string.Format("LoginUrl={0}/&UserToken={1}", _cloudUrl, token); return Convert.ToBase64String(Encoding.UTF8.GetBytes(warehouseCtx));*/ } } #endregion #region 电子仓访问凭证 private string Token { get { var token = Guid.NewGuid().ToString(); return token; } } #endregion #region 物理文件id private string GetFileId(string fileId) { return Convert.ToBase64String(Encoding.UTF8.GetBytes(fileId)); } #endregion #region 发送请求 public Stream SendRequest(string op, string fileId) { var header = new Dictionary { { "FileID", GetFileId(fileId) }, { "CTX", WarehouseCTX }, { "token", Token }, { "PLM_ACCESS_TYPE", "pure" } }; return PostDataViaHttpWebRequest(RequestUrl(op), string.Empty, header, !op.Equals("Download")); } #endregion #region 请求的URL private string RequestUrl(string op) { return _warehouse + "/" + op; } #endregion #region 获取响应 private HttpWebResponse GetResponse(string url, string bodyJson, Dictionary header) { var data = Encoding.UTF8.GetBytes(bodyJson); var request = (HttpWebRequest)WebRequest.Create(url); request.Method = WebRequestMethods.Http.Post; request.ContentType = "application/json"; request.ContentLength = data.Length; if (header != null) foreach (var p in header) request.Headers.Add(p.Key, p.Value); using (var reqStream = request.GetRequestStream()) { reqStream.Write(data, 0, data.Length); reqStream.Close(); } HttpWebResponse resp = null; try { resp = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { var res = ex.Response; if (res != null) { var statusBase64 = ((HttpWebResponse)ex.Response) .StatusDescription; //base64编码后的报错信息 } } return resp; } #endregion #region 返回文件流给前端 private Stream PostDataViaHttpWebRequest(string url, string bodyJson, Dictionary header, bool isGetContent) { var resp = GetResponse(url, bodyJson, header); Console.WriteLine(resp.GetResponseStream()); return resp.GetResponseStream(); // 直接返回响应流 } #endregion #region 保存文件到本地 /* private void PostDataViaHttpWebRequest(string url, string bodyJson, Dictionary header, bool isGetContent) { var resp = GetResponse(url, bodyJson, header); var resultJson = string.Empty; Stream stream = File.Open("D://DownloadDocDemo.pdf", FileMode.OpenOrCreate); int packageSize = 1024 * 1024; byte[] buffer = new byte[packageSize]; using (stream) { using (Stream outputStream = resp.GetResponseStream()) { int readLength = 0; while ((readLength = outputStream.Read(buffer, 0, packageSize)) > 0) { stream.Write(buffer, 0, readLength); stream.Flush(); } outputStream.Close(); } stream.Close(); } }*/ #endregion } #endregion