using DW5S.Repostory; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Security.Policy; using System.Text; using System.Threading; using System.Threading.Tasks; /// /// http调用帮助类 /// public class HttpHelper { /// /// 文件删除模型 /// class FileDeleteDto { /// /// 要删除的服务器上的文件名称 /// public List Files { get; set; } } static HttpHelper() { //client = new HttpClient(new HttpClientHandler() //{ // UseCookies = false, // UseDefaultCredentials = false, // UseProxy = false, // AllowAutoRedirect = false, //}); //client.Timeout = TimeSpan.FromSeconds(60); ////client.MaxResponseContentBufferSize //该值默认为2GB //downLoadClient = new HttpClient(new HttpClientHandler() //{ // UseCookies = false, // UseDefaultCredentials = false, // UseProxy = false, // AllowAutoRedirect = false, //}); //downLoadClient.Timeout = TimeSpan.FromSeconds(180); } private static readonly string httpKey = "DW5S"; private static readonly string httpFileKey = "DW5S_File"; /// /// /// /// /// /// /// /// public static async Task> PostRequestAsync(string url, object dto, CancellationToken token = default) { url = SysConfig.GetUrl(url); var factory = IocContainer.GetService(); var client = factory.CreateClient(httpKey); var content = new StringContent(JsonConvert.SerializeObject(dto), System.Text.Encoding.UTF8, "application/json"); var message = new HttpRequestMessage(HttpMethod.Post, url); message.Content = content; var response = await client.SendAsync(message, token); message.Dispose();//http1.1没啥用,http2有用 response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); var AjaxResult = JsonConvert.DeserializeObject>(result); return AjaxResult; } public static async Task PostRequestAsync(string url, object dto, CancellationToken token = default) { url = SysConfig.GetUrl(url); var factory = IocContainer.GetService(); var client = factory.CreateClient(httpKey); var content = new StringContent(JsonConvert.SerializeObject(dto), System.Text.Encoding.UTF8, "application/json"); var message = new HttpRequestMessage(HttpMethod.Post, url); message.Content = content; var response = await client.SendAsync(message, token); message.Dispose();//http1.1没啥用,http2有用 response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); var AjaxResult = JsonConvert.DeserializeObject(result); return AjaxResult; } public static async Task> GetRequestAsync(string url) { url = SysConfig.GetUrl(url); var factory = IocContainer.GetService(); var client = factory.CreateClient(httpKey); var response = await client.GetAsync(url); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); var AjaxResult = JsonConvert.DeserializeObject>(result); return AjaxResult; } public static async Task DownloadWithNameAsync(string remoteFileName, string localFile) { string url = SysConfig.GetUrl($"upload/{remoteFileName}"); var factory = IocContainer.GetService(); var client = factory.CreateClient(httpFileKey); var responseMessage = await client.GetAsync(url); if (responseMessage.IsSuccessStatusCode) { using (var fs = File.Create(localFile)) { // 获取结果,并转成 stream 保存到本地。 var streamFromService = await responseMessage.Content.ReadAsStreamAsync(); streamFromService.CopyTo(fs); } return true; } else return false; } public static async Task DownloadAsync(string url, string localFile) { var factory = IocContainer.GetService(); var client = factory.CreateClient(httpFileKey); var responseMessage = await client.GetAsync(url); if (responseMessage.IsSuccessStatusCode) { using (var fs = File.Create(localFile)) { // 获取结果,并转成 stream 保存到本地。 var streamFromService = await responseMessage.Content.ReadAsStreamAsync(); streamFromService.CopyTo(fs); } return true; } else return false; } private static string GetMimeType(string fileName) { string ext = Path.GetExtension(fileName).ToLower(); return ext switch { ".txt" => "text/plain", ".jpg" or ".jpeg" => "image/jpeg", ".png" => "image/png", ".pdf" => "application/pdf", _ => "application/octet-stream" }; } public static async Task UploadFileAsync(string localFile,string baseUrl=null, CancellationToken token = default) { string url = SysConfig.GetUrl("file/upload", baseUrl); try { var factory = IocContainer.GetService(); var client = factory.CreateClient(httpFileKey); using var formData = new MultipartFormDataContent(); var fileContent = new StreamContent(File.OpenRead(localFile)); fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); //注意:files必须和接口中的参数保持一致 formData.Add(fileContent, "files", Path.GetFileName(localFile)); // 发送请求 var response = await client.PostAsync(url, formData, token); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(token); var AjaxResult = JsonConvert.DeserializeObject>>(responseBody); if (AjaxResult.code == 200) { return AjaxResult.data.FirstOrDefault(); } else { throw new Exception(AjaxResult.msg); } } else { throw new Exception($"上传文件{Path.GetFileName(localFile)}到{url}失败!"); } } catch (Exception ex) { throw new Exception($"上传文件{Path.GetFileName(localFile)}到{url}失败!", ex); } } public static async Task> UploadFileAsync(IEnumerable localFiles, string baseUrl=null, CancellationToken token = default) { string url = SysConfig.GetUrl("file/upload",baseUrl); try { var factory = IocContainer.GetService(); var client = factory.CreateClient(httpFileKey); using var formData = new MultipartFormDataContent(); foreach (var localFile in localFiles) { var fileContent = new StreamContent(File.OpenRead(localFile)); fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); //注意:files必须和接口中的参数保持一致 formData.Add(fileContent, "files", Path.GetFileName(localFile)); } // 发送请求 var response = await client.PostAsync(url, formData, token); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(token); var AjaxResult = JsonConvert.DeserializeObject>>(responseBody); if (AjaxResult.code == 200) { return AjaxResult.data; } else { throw new Exception(AjaxResult.msg); } } else { throw new Exception($"批量上传文件到{url}失败!"); } } catch (Exception ex) { throw new Exception($"批量上传文件到到{url}失败!", ex); } } ///// ///// 上传文件,wav文件会自动去掉44字节头 ///// ///// ///// ///// ///// //public static async Task UploadFileAsync(string localFile, string baseUrl, CancellationToken token = default) //{ // string uploadUrl = baseUrl; // if (baseUrl.EndsWith("/")) // uploadUrl += "File/UploadFileAsync"; // else // uploadUrl += "/File/UploadFileAsync"; // try // { // // 添加文件内容到 MultipartFormDataContent // FileInfo info = new FileInfo(localFile); // bool isWav = info.Extension.ToLower() == ".wav"; // byte[] fileBytes = File.ReadAllBytes(localFile); // if (isWav) // { // fileBytes = fileBytes.Skip(44).ToArray();//wav文件有44字节头 // } // MultipartFormDataContent content = new MultipartFormDataContent(); // ByteArrayContent fileContent = new ByteArrayContent(fileBytes); // content.Add(fileContent, "file", Path.GetFileName(localFile)); // var message = new HttpRequestMessage(HttpMethod.Post, uploadUrl); // message.Content = content; // var response = await downLoadClient.SendAsync(message, token); // message.Dispose(); // response.EnsureSuccessStatusCode(); // var result = await response.Content.ReadAsStringAsync(); // var AjaxResult = JsonConvert.DeserializeObject>(result); // if (AjaxResult.code == 200) // { // return AjaxResult.data; // } // else // { // throw new Exception(AjaxResult.msg); // } // } // catch (TaskCanceledException) // { // if (token != default && token.IsCancellationRequested) // throw new TaskCanceledException(); // else // throw new Exception($"上传文件{Path.GetFileName(localFile)}到{uploadUrl}超时!"); // } // catch (Exception ex) // { // throw new Exception($"上传文件{Path.GetFileName(localFile)}到{uploadUrl}失败!", ex); // } //} /// /// 删除文件 /// /// 要删除的文件 /// baseUrl /// public static async Task DeleteFileAsync(params string[] files) { string url = SysConfig.GetUrl("File/DeleteFiles"); var factory = IocContainer.GetService(); var client = factory.CreateClient(httpKey); FileDeleteDto dto = new FileDeleteDto() { Files = files.ToList() }; var content = new StringContent(JsonConvert.SerializeObject(dto), System.Text.Encoding.UTF8, "application/json"); var message = new HttpRequestMessage(HttpMethod.Post, url); message.Content = content; var response = await client.SendAsync(message); message.Dispose(); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); var AjaxResult = JsonConvert.DeserializeObject>(result); return AjaxResult.data; } } /// /// Http接口返回泛型对象 /// public class AjaxResult { /// /// 返回对象 /// public T data { get; set; } /// /// 返回消息 /// public string msg { get; set; } = "ok"; /// /// 状态码.成功=200,失败=0 /// public int code { get; set; } = 200; } /// /// Http接口返回对象 /// public class AjaxResult { /// /// 返回对象 /// public object data { get; set; } /// /// 返回消息 /// public string msg { get; set; } = "ok"; /// /// 状态码.成功=200,失败=0 /// public int code { get; set; } = 200; }