173 lines
5.9 KiB
C#
173 lines
5.9 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|