1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
public static async Task<T?> UploadPostAsync<T>(Uri baseAddress, string? requestUrl, IDictionary<string, object>? parameters, IDictionary<string, string>? parameterFiles, Action<object?, HttpProgressEventArgs>? progressAction = null, string? token = null) { ProgressMessageHandler progress = new ProgressMessageHandler(); progress.HttpSendProgress += (s, e) => { progressAction?.Invoke(s, e); };
var vHttpClient = HttpClientFactory.Create(progress); vHttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
List<FileStream> files = new(); List<StreamContent> streams = new();
try { if (!string.IsNullOrEmpty(token)) { vHttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); } vHttpClient.Timeout = TimeSpan.FromMinutes(20);
var vBuilder = new StringBuilder(); vBuilder.Append(baseAddress); vBuilder.Append(requestUrl);
var vMultipartForm = new MultipartFormDataContent(); if (parameters != null && parameters.Count >= 1) { foreach (var parameter in parameters) { vMultipartForm.Add(new StringContent(parameter.Value?.ToString() ?? string.Empty), parameter.Key); } }
if (parameterFiles != null && parameterFiles.Count >= 1) { foreach (var parameterFile in parameterFiles) { string filePath = parameterFile.Value; var fileName = Path.GetFileName(filePath);
var fileStream = File.OpenRead(filePath); files.Add(fileStream); var streamContent = new StreamContent(fileStream); streams.Add(streamContent); vMultipartForm.Add(streamContent, parameterFile.Key, fileName); } }
using var vResponse = await vHttpClient.PostAsync(vBuilder.ToString(), vMultipartForm); if (vResponse.StatusCode == HttpStatusCode.OK) { return typeof(T).FullName.Equals("System.String") || typeof(T).FullName.Equals("System.Boolean") ? (T)Convert.ChangeType(await vResponse.Content.ReadAsStringAsync(), typeof(T)) : JsonConvert.DeserializeObject<T>(await vResponse.Content.ReadAsStringAsync()); } else { return default; } } catch (Exception) { return default; } finally { foreach (var item in files) { item.Dispose(); } files.Clear();
foreach (var item in streams) { item.Dispose(); } streams.Clear();
vHttpClient.Dispose(); vHttpClient = null; GC.Collect(); } }
|