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 HttpClient client; private static HttpClient downLoadClient; public static async Task> PostRequestAsync(string url, object dto, CancellationToken token = default) { 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) { 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) { 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 DownloadFileAsync(string baseUrl, string remoteFileName, string localFile) { baseUrl = baseUrl.Replace("/api", ""); if (!baseUrl.EndsWith("/")) baseUrl += "/"; var server = new Uri(baseUrl + $"wwwroot/{remoteFileName}"); var responseMessage = await downLoadClient.GetAsync(server); 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 DownloadFileAsync(string url, string localFile) { var server = new Uri(url); var responseMessage = await downLoadClient.GetAsync(server); if (responseMessage.IsSuccessStatusCode) { using (var fs = File.Create(localFile)) { // 获取结果,并转成 stream 保存到本地。 var streamFromService = await responseMessage.Content.ReadAsStreamAsync(); streamFromService.CopyTo(fs); } return true; } else return false; } /// /// 上传文件,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(string baseUrl, params string[] files) { 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, baseUrl + "/File/DeleteFiles"); 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; }