双向同步后端测试完毕
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
89fb8eac00
commit
c833c88fe3
|
|
@ -32,7 +32,7 @@
|
|||
"ApiDeployRegion": "CN",
|
||||
"SyncConfigList": [
|
||||
{
|
||||
"Domain": "ir.test.extimaging.com",
|
||||
"Domain": "irc.test.extimaging.com",
|
||||
"Primary": "AliyunOSS",
|
||||
"Target": "AWS",
|
||||
"UploadRegion": "CN",
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ using Amazon.S3;
|
|||
using Amazon.S3.Model;
|
||||
using Amazon.SecurityToken;
|
||||
using Amazon.SecurityToken.Model;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
|
|
@ -18,7 +19,6 @@ using Minio;
|
|||
using Minio.DataModel;
|
||||
using Minio.DataModel.Args;
|
||||
using Minio.Exceptions;
|
||||
using Org.BouncyCastle.Tls;
|
||||
using Serilog.Parsing;
|
||||
using SkiaSharp;
|
||||
using System.IO;
|
||||
|
|
@ -1922,11 +1922,11 @@ public class OSSService(IOptionsMonitor<ObjectStoreServiceOptions> options,
|
|||
objectStoreDTO.AliyunOSS = tempToken;
|
||||
|
||||
}
|
||||
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
|
||||
if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
|
||||
{
|
||||
objectStoreDTO.MinIO = ObjectStoreServiceOptions.MinIO;
|
||||
}
|
||||
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS" || isGetAllTempToken == true)
|
||||
if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS" || isGetAllTempToken == true)
|
||||
{
|
||||
var awsOptions = ObjectStoreServiceOptions.AWS;
|
||||
|
||||
|
|
@ -1982,7 +1982,7 @@ public class OSSService(IOptionsMonitor<ObjectStoreServiceOptions> options,
|
|||
|
||||
public async Task SyncFileAsync(string objectKey, ObjectStoreUse source, ObjectStoreUse destination, CancellationToken ct = default)
|
||||
{
|
||||
GetObjectStoreTempToken(isGetAllTempToken: true);
|
||||
var tempConfig = GetObjectStoreTempToken(isGetAllTempToken: true);
|
||||
|
||||
|
||||
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
|
||||
|
|
@ -2001,36 +2001,81 @@ public class OSSService(IOptionsMonitor<ObjectStoreServiceOptions> options,
|
|||
|
||||
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
|
||||
|
||||
// ⭐ 关键变量
|
||||
IDisposable? owner = null;
|
||||
Stream sourceStream;
|
||||
long contentLength;
|
||||
|
||||
// 根据源选择流式下载
|
||||
Stream sourceStream = source switch
|
||||
// ========= 获取流 + 长度 =========
|
||||
switch (source)
|
||||
{
|
||||
case ObjectStoreUse.AliyunOSS:
|
||||
{
|
||||
ObjectStoreUse.AliyunOSS => _ossClient.GetObject(aliConfig.BucketName, objectKey).Content,
|
||||
ObjectStoreUse.AWS => (await amazonS3Client.GetObjectAsync(awsConfig.BucketName, objectKey, ct)).ResponseStream,
|
||||
_ => throw new BusinessValidationFailedException("未定义的同步类型")
|
||||
};
|
||||
|
||||
if (source == ObjectStoreUse.AliyunOSS)
|
||||
var obj = _ossClient.GetObject(
|
||||
aliConfig.BucketName,
|
||||
objectKey);
|
||||
|
||||
owner = obj;
|
||||
sourceStream = obj.Content;
|
||||
contentLength = obj.ContentLength;
|
||||
break;
|
||||
}
|
||||
|
||||
case ObjectStoreUse.AWS:
|
||||
{
|
||||
var response = await amazonS3Client.GetObjectAsync(
|
||||
awsConfig.BucketName,
|
||||
objectKey,
|
||||
ct);
|
||||
|
||||
owner = response;
|
||||
sourceStream = response.ResponseStream;
|
||||
contentLength = response.Headers.ContentLength;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
throw new BusinessValidationFailedException("未定义的同步类型");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// ========= 上传 =========
|
||||
if (destination == ObjectStoreUse.AWS)
|
||||
{
|
||||
var putRequest = new Amazon.S3.Model.PutObjectRequest
|
||||
{
|
||||
BucketName = awsConfig.BucketName,
|
||||
Key = objectKey,
|
||||
InputStream = sourceStream
|
||||
InputStream = sourceStream,
|
||||
Headers = { ContentLength = contentLength }
|
||||
};
|
||||
|
||||
await amazonS3Client.PutObjectAsync(putRequest, ct);
|
||||
}
|
||||
else if (source == ObjectStoreUse.AWS)
|
||||
else if (destination == ObjectStoreUse.AliyunOSS)
|
||||
{
|
||||
_ossClient.PutObject(aliConfig.BucketName, objectKey, sourceStream);
|
||||
_ossClient.PutObject(
|
||||
aliConfig.BucketName,
|
||||
objectKey,
|
||||
sourceStream);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new BusinessValidationFailedException("未定义的同步类型");
|
||||
}
|
||||
|
||||
await sourceStream.DisposeAsync(); // 释放流
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error($"同步错误:{ex.Message}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
// ⭐⭐⭐ 真正释放 HTTP 连接
|
||||
owner?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
//await WeComNotifier.SendErrorAsync(webhook, "http://irc.test.extimaging.com/login", new Exception("测试异常"), new[] { "ZhouHang" });
|
||||
|
||||
//throw new Exception("手动测试异常抛出");
|
||||
return ResponseOutput.Ok(modelVerify);
|
||||
return ResponseOutput.Ok(_userInfo.Domain);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue