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; } } /// /// /// /// /// /// /// /// /// public static async Task> PostRequestAsync(string url, object dto, int timeoutSeconds = 60, CancellationToken token = default) { var content = new StringContent(JsonConvert.SerializeObject(dto), System.Text.Encoding.UTF8, "application/json"); var handler = new HttpClientHandler() { UseCookies = false }; HttpClient client = new HttpClient(handler); client.Timeout = TimeSpan.FromSeconds(timeoutSeconds); var message = new HttpRequestMessage(HttpMethod.Post, url); message.Content = content; var response = await client.SendAsync(message, token); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); var AjaxResult = JsonConvert.DeserializeObject>(result); return AjaxResult; } /// /// /// /// /// /// /// /// public static async Task PostRequestAsync(string url, object dto, int timeoutSeconds = 60, CancellationToken token = default) { var content = new StringContent(JsonConvert.SerializeObject(dto), System.Text.Encoding.UTF8, "application/json"); var handler = new HttpClientHandler() { UseCookies = false }; HttpClient client = new HttpClient(handler); client.Timeout = TimeSpan.FromSeconds(timeoutSeconds); var message = new HttpRequestMessage(HttpMethod.Post, url); message.Content = content; var response = await client.SendAsync(message, token); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); var AjaxResult = JsonConvert.DeserializeObject(result); return AjaxResult; } public static async Task> GetRequestAsync(string url, int timeoutSeconds = 60) { var handler = new HttpClientHandler() { UseCookies = false }; HttpClient client = new HttpClient(handler); client.Timeout = TimeSpan.FromSeconds(timeoutSeconds); 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, int timeoutSeconds = 30) { baseUrl = baseUrl.Replace("/api", ""); if (!baseUrl.EndsWith("/")) baseUrl += "/"; var server = new Uri(baseUrl + $"wwwroot/{remoteFileName}"); var httpClient = new HttpClient(); httpClient.Timeout = TimeSpan.FromSeconds(timeoutSeconds); var responseMessage = await httpClient.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, int timeoutSeconds = 30, 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 handler = new HttpClientHandler() { UseCookies = false }; HttpClient client = new HttpClient(handler); client.Timeout = TimeSpan.FromSeconds(timeoutSeconds); var message = new HttpRequestMessage(HttpMethod.Post, uploadUrl); message.Content = content; var response = await client.SendAsync(message, token); 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 != null && 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[] files, string baseUrl) { FileDeleteDto dto = new FileDeleteDto() { Files = files.ToList() }; var content = new StringContent(JsonConvert.SerializeObject(dto), System.Text.Encoding.UTF8, "application/json"); var handler = new HttpClientHandler() { UseCookies = false }; HttpClient client = new HttpClient(handler); client.Timeout = TimeSpan.FromSeconds(30); var message = new HttpRequestMessage(HttpMethod.Post, baseUrl + "/File/DeleteFiles"); message.Content = content; var response = await client.SendAsync(message); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync(); var AjaxResult = JsonConvert.DeserializeObject>(result); return AjaxResult.data; } /// /// 删除文件 /// /// 要删除的文件 /// 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 handler = new HttpClientHandler() { UseCookies = false }; HttpClient client = new HttpClient(handler); client.Timeout = TimeSpan.FromSeconds(30); var message = new HttpRequestMessage(HttpMethod.Post, baseUrl + "/File/DeleteFiles"); message.Content = content; var response = await client.SendAsync(message); 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; }