///上传镜像 /// </summary> public CommonResponse Upload(object eventData) { var ret = new CommonResponse("0"); var jsData = JsonUtil.SerializeObject(eventData); var request = JsonUtil.DeserializeObject <CommonRequest>(jsData); ret.Ips = request.Ips; if (!File.Exists(request.Data.ToString())) { ret.Code = ErrorCode.FILE_NOTFOUND; LogUtil.HWLogger.UI.Error("Upload OS Image failed: File path error,error path " + request.Data.ToString()); return(ret); } var fusionDirector = FusionDirectorWorker.Instance.FindByIP(request.Ips[0]); if (fusionDirector == null) { LogUtil.HWLogger.UI.Error("Upload VersionWarehouse failed: not found Fd" + request.Ips[0].ToString()); ret.Code = ErrorCode.NET_FD_NOFOUND; return(ret); } Task.Factory.StartNew(() => { try { byte[] bytes = System.Text.Encoding.UTF8.GetBytes(fusionDirector.LoginAccount + ":" + fusionDirector.LoginPwd); var authStr = "Basic " + Convert.ToBase64String(bytes); var remoteUrl = "https://" + fusionDirector.HostIP + ":" + fusionDirector.Port + "/redfish/v1" + request.Endpoint; FileStream fs = new FileStream(request.Data.ToString(), FileMode.Open, FileAccess.Read); ret.Description = Math.Round((decimal)fs.Length / (1024 * 1024), 0).ToString(); byte[] boundaryBytes; Stream postStream; using (BinaryReader r = new BinaryReader(fs)) { var fileName = request.Data.ToString().Substring(request.Data.ToString().LastIndexOf('\\') + 1); //时间戳 string strBoundary = "--" + DateTime.Now.Ticks.ToString("x"); boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); //请求头部信息 StringBuilder sb = new StringBuilder(); sb.Append("--"); sb.Append(strBoundary); sb.Append("\r\n"); sb.Append("Content-Disposition: form-data; name=\""); sb.Append("tiFile"); sb.Append("\"; filename=\"" + fileName + ""); sb.Append("\";"); sb.Append("\r\n"); sb.Append("Content-Type: "); sb.Append("application/octet-stream;"); sb.Append("\r\n"); sb.Append("\r\n"); string strPostHeader = sb.ToString(); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader); //默认忽略证书 ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; //兼容所有ssl协议 ServicePointManager.SecurityProtocol = (SecurityProtocolType)(3072 | 768 | 192 | 48); httpWebRequest = (HttpWebRequest)WebRequest.Create(new Uri(remoteUrl)); httpWebRequest.Method = "POST"; ////创建证书文件 //X509Certificate objx509 = new X509Certificate(Application.StartupPath + "\\123.cer"); ////添加到请求里 //request.ClientCertificates.Add(objx509); httpWebRequest.AllowWriteStreamBuffering = false; httpWebRequest.Timeout = 1000 * 60 * 60 * 3; httpWebRequest.Headers.Add("Authorization", authStr); httpWebRequest.ContentType = "multipart/form-data; boundary=" + strBoundary; long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length; long fileLength = fs.Length; httpWebRequest.ContentLength = length; //每次上传4k int bufferLength = 4096; byte[] buffer = new byte[bufferLength]; //已上传的字节数 long offset = 0; //开始上传时间 DateTime startTime = DateTime.Now; int size = r.Read(buffer, 0, bufferLength); postStream = httpWebRequest.GetRequestStream(); //发送请求头部消息 postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); while (size > 0) { postStream.Write(buffer, 0, size); offset += size; var Progress = Convert.ToInt32(Math.Round((decimal)offset / length, 2) * 100); FDBrowser.ExecuteScriptAsync("setUploadFileProgress", Progress); Application.DoEvents(); size = r.Read(buffer, 0, bufferLength); } } //添加尾部的时间戳 postStream.Write(boundaryBytes, 0, boundaryBytes.Length); postStream.Close(); //获取服务器端的响应 WebResponse webRespon = httpWebRequest.GetResponse(); Stream requestStream = webRespon.GetResponseStream(); string content; using (StreamReader sr = new StreamReader(requestStream, System.Text.Encoding.UTF8)) { content = sr.ReadToEnd(); } LogUtil.HWLogger.API.Info(content); requestStream.Close(); var response = httpWebRequest.GetResponse() as HttpWebResponse; if (response == null) { throw new ArgumentNullException(nameof(response)); } var statusCode = ((int)response.StatusCode).ToString(); var task = response.Headers.GetValues("Task"); if (task != null) { ret.Headers = new { Task = task[0] }; } ret.Data.Add(new Item() { Ip = fusionDirector.HostIP, Code = statusCode, Data = JsonConvert.DeserializeObject(content) }); if (!statusCode.StartsWith("2")) { throw new Exception(statusCode); } } catch (BaseException ex) { LogUtil.HWLogger.UI.Error("Upload OS Image failed: ", ex); ret.Code = "-1"; } catch (Exception ex) { LogUtil.HWLogger.UI.Error("Upload OS Image failed: ", ex); ret.Code = ErrorCode.SYS_UNKNOWN_ERR; } ret.Ips = request.Ips; FDBrowser.ExecuteScriptAsync("uploadFileSuccess", JsonConvert.SerializeObject(ret)); }); return(ret); }
///上传签名 /// </summary> public CommonResponse UploadSignature(object eventData) { var ret = new CommonResponse("0"); var jsData = JsonUtil.SerializeObject(eventData); var request = JsonUtil.DeserializeObject <CommonRequest>(jsData); ret.Ips = request.Ips; if (!File.Exists(request.Data.ToString())) { ret.Code = ErrorCode.FILE_NOTFOUND; LogUtil.HWLogger.UI.Error("Upload Signatur failed: File path error,error path " + request.Data.ToString()); return(ret); } var fusionDirector = FusionDirectorWorker.Instance.FindByIP(request.Ips[0]); if (fusionDirector == null) { ret.Code = ErrorCode.NET_FD_NOFOUND; LogUtil.HWLogger.UI.Error("Upload Signatur failed: not found Fd" + request.Ips[0].ToString()); return(ret); } AggregateExceptionCatched2 += new EventHandler <AggregateExceptionArgs>(Program_AggregateExceptionCatched2); TokenSource2 = new CancellationTokenSource(); Task.Factory.StartNew(() => { try { byte[] bytes = System.Text.Encoding.UTF8.GetBytes(fusionDirector.LoginAccount + ":" + fusionDirector.LoginPwd); var authStr = "Basic " + Convert.ToBase64String(bytes); var remoteUrl = "https://" + fusionDirector.HostIP + ":" + fusionDirector.Port + "/redfish/v1" + request.Endpoint; //默认忽略证书 ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; //兼容所有ssl协议 ServicePointManager.SecurityProtocol = (SecurityProtocolType)(3072 | 768 | 192 | 48); var file = File.Open(request.Data.ToString(), FileMode.Open, FileAccess.Read); ret.Description = Math.Round((decimal)file.Length / (1024 * 1024), 0).ToString(); var fileContent = new StreamContent(file) { Headers = { ContentLength = file.Length, ContentType = new MediaTypeHeaderValue("application/octet-stream") } }; var formDataContent = new MultipartFormDataContent(); var fileName = file.Name.Substring(file.Name.LastIndexOf('\\') + 1); formDataContent.Add(fileContent, "tiFile", fileName); var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, remoteUrl); var progressContent = new ProgressableStreamContent(formDataContent, 4096 * 100, (sent, total) => { try { var Progress = Convert.ToInt32(Math.Round((decimal)sent / total, 2) * 100); FDBrowser.ExecuteScriptAsync("setUploadSignaturProgress", Progress);//设置升级包上传进度 setUploadSignaturProgress是UI js方法名称 Progress是进度 0-100 } catch (Exception ex) { AggregateExceptionArgs args = new AggregateExceptionArgs() { AggregateException = new AggregateException(ex) }; //使用主线程委托代理,处理子线程 异常 //这种方式没有阻塞 主线程或其他线程 AggregateExceptionCatched1?.Invoke(null, args); throw ex; } }); httpRequestMessage.Content = progressContent; httpRequestMessage.Headers.Add("Authorization", authStr); using (HttpClient httpClient = new HttpClient()) { var httpResponse = httpClient.SendAsync(httpRequestMessage, TokenSource2.Token).Result; var statusCode = ((int)httpResponse.StatusCode).ToString(); var resultStr = httpResponse.Content.ReadAsStringAsync().Result; LogUtil.HWLogger.API.Info("URL:" + remoteUrl + " Api Result:" + resultStr); ret.Data.Add(new Item() { Ip = fusionDirector.HostIP, Code = statusCode, Data = JsonConvert.DeserializeObject(resultStr) }); if (!statusCode.StartsWith("2")) { throw new BaseException(statusCode, ""); } fileContent.Dispose(); } file.Dispose(); } catch (BaseException ex) { LogUtil.HWLogger.UI.Error("Upload Signatur failed: ", ex); ret.Code = ex.Code; } catch (Exception ex) { LogUtil.HWLogger.UI.Error("Upload Signatur failed: ", ex); ret.Code = ErrorCode.SYS_UNKNOWN_ERR; AggregateExceptionArgs args = new AggregateExceptionArgs() { AggregateException = new AggregateException(ex) }; //使用主线程委托代理,处理子线程 异常 //这种方式没有阻塞 主线程或其他线程 AggregateExceptionCatched2?.Invoke(null, args); } ret.Ips = request.Ips; FDBrowser.ExecuteScriptAsync("uploadSignaturFileSuccess", JsonConvert.SerializeObject(ret));//执行升级包上传成功方法 uploadSignaturFileSuccess是UI js升级包上传成功方法 }); return(ret); }