LMS.service/LMS.Tools/HttpTool/HttpService.cs

173 lines
5.9 KiB
C#
Raw Normal View History

2025-09-13 18:04:51 +08:00
using LMS.Tools.FileTool;
using Microsoft.Extensions.Logging;
using System.Text;
namespace LMS.Tools.HttpTool
{
/// <summary>
/// HTTP<54><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public class HttpService : IHttpService
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger<HttpService> _logger;
public HttpService(
IHttpClientFactory httpClientFactory,
ILogger<HttpService> logger)
{
_httpClientFactory = httpClientFactory;
_logger = logger;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="url"><3E>ļ<EFBFBD>URL</param>
/// <returns><3E>ļ<EFBFBD><C4BC>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD></returns>
public async Task<byte[]?> DownloadFileAsync(string url, double maxFileSize)
{
try
{
if (string.IsNullOrWhiteSpace(url))
throw new ArgumentException("URL<52><4C><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>", nameof(url));
if (!Uri.IsWellFormedUriString(url, UriKind.Absolute))
throw new ArgumentException("<22><>Ч<EFBFBD><D0A7>URL<52><4C>ʽ", nameof(url));
using var httpClient = _httpClientFactory.CreateClient("HttpService");
using var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException($"HTTP<54><50><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>״̬<D7B4><CCAC>: {response.StatusCode}");
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С
if (response.Content.Headers.ContentLength.HasValue)
{
if (response.Content.Headers.ContentLength.Value > maxFileSize * 1024 * 1024)
{
throw new InvalidOperationException($"<22>ļ<EFBFBD><C4BC><EFBFBD>С({response.Content.Headers.ContentLength.Value} bytes)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>({maxFileSize * 1024 * 1024} bytes)");
}
}
var fileBytes = await response.Content.ReadAsByteArrayAsync();
if (fileBytes.Length > maxFileSize * 1024 * 1024)
{
throw new InvalidOperationException($"<22><><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD>С({fileBytes.Length} bytes)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>({maxFileSize * 1024 * 1024} bytes)");
}
return fileBytes;
}
catch (HttpRequestException ex)
{
_logger.LogError(ex, "HTTP<54><50><EFBFBD><EFBFBD><EFBFBD>쳣: {Url}", url);
throw;
}
catch (TaskCanceledException ex)
{
_logger.LogError(ex, "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ: {Url}", url);
throw new TimeoutException("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ", ex);
}
catch (Exception ex)
{
_logger.LogError(ex, "<22><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʧ<EFBFBD><CAA7>: {Url}", url);
throw;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>GET<45><54><EFBFBD><EFBFBD>
/// </summary>
/// <param name="url"><3E><><EFBFBD><EFBFBD>URL</param>
/// <returns><3E><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD></returns>
public async Task<string> GetAsync(string url)
{
try
{
if (string.IsNullOrWhiteSpace(url))
throw new ArgumentException("URL<52><4C><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>", nameof(url));
using var httpClient = _httpClientFactory.CreateClient("HttpService");
var response = await httpClient.GetStringAsync(url);
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "GET<45><54><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>: {Url}", url);
throw;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>POST<53><54><EFBFBD><EFBFBD>
/// </summary>
/// <param name="url"><3E><><EFBFBD><EFBFBD>URL</param>
/// <param name="content"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD></returns>
public async Task<string> PostAsync(string url, string content)
{
try
{
if (string.IsNullOrWhiteSpace(url))
throw new ArgumentException("URL<52><4C><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>", nameof(url));
using var httpClient = _httpClientFactory.CreateClient("HttpService");
var httpContent = new StringContent(content, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(url, httpContent);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
_logger.LogError(ex, "POST<53><54><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>: {Url}", url);
throw;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>URL<52>Ƿ<EFBFBD><C7B7>ɷ<EFBFBD><C9B7><EFBFBD>
/// </summary>
/// <param name="url">Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>URL</param>
/// <returns><3E>Ƿ<EFBFBD><C7B7>ɷ<EFBFBD><C9B7><EFBFBD></returns>
public async Task<bool> IsUrlAccessibleAsync(string url)
{
try
{
using var httpClient = _httpClientFactory.CreateClient("HttpService");
using var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
return response.IsSuccessStatusCode;
}
catch
{
return false;
}
}
/// <summary>
/// <20><>ȡURL<52><4C>Content-Type
/// </summary>
/// <param name="url">Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>URL</param>
/// <returns>Content-Type</returns>
public async Task<string?> GetContentTypeAsync(string url)
{
try
{
using var httpClient = _httpClientFactory.CreateClient("HttpService");
using var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
if (response.IsSuccessStatusCode)
{
return response.Content.Headers.ContentType?.MediaType;
}
return null;
}
catch
{
return null;
}
}
}
}