前言
最近有需要用到AWS S3雲端儲存上傳附件,這裡對利用.NET或.NET Core在呼叫SDK APi需要注意的一點小問題做個記錄,或許能對後續有用到的童鞋提供一點幫助
AWS S3雲端儲存
官方已提供針對.NET/.NET Core針對S3的APi(https://docs.aws.amazon.com/sdkfornet/v3/apidocs/)和SDK demo(https://github.com/awslabs/aws-sdk-net-samples),首先我們下載針對.NET Core的SDK包(AWSSDK.Core)以及通過S3儲存物件包(AWSSDK.S3),如下圖所示
接下來我們再利用官方所給SDK Demo,此時並不能直接複製拿來使用,如下:
using (client = new AmazonS3Client(RegionEndpoint.USWest2)) { Console.WriteLine("Listing buckets"); ListingBuckets(); Console.WriteLine("Creating a bucket"); CreateABucket(); Console.WriteLine("Writing an object"); WritingAnObject(); Console.WriteLine("Reading an object"); ReadingAnObject(); Console.WriteLine("Deleting an object"); DeletingAnObject(); Console.WriteLine("Listing objects"); ListingObjects(); }
AWS S3上傳附件要提供上傳憑證和配置,AK(awsAccessKeyId)和SK(awsSecretAccessKey)作為憑證。Region(awsRegion)和EndPoint(awsEndPoint)作為配置,大部分情況下我們都是利用如下構造
public AmazonS3Client(AWSCredentials credentials, AmazonS3Config clientConfig);
因憑證就是AK/SK,我們也可直接提供ak、sk,如下構造,一切根據實際業務對接情況而具體分析
public AmazonS3Client(string awsAccessKeyId, string awsSecretAccessKey, AmazonS3Config clientConfig);
通過官網介紹,憑證可以通過配置檔案、環境變數等等共享,這一塊並不是重點,未細看,請忽略,我直接將其存放到配置檔案中。最終構造AWSS3Client,如下程式碼:
//提供awsAccessKeyId和awsSecretAccessKey構造憑證 var credentials = new BasicAWSCredentials(awsAccessKeyId, awsSecretAccessKey); //提供awsEndPoint(域名)進行訪問配置 var clientConfig = new AmazonS3Config { ServiceURL = awsEndPoint }; var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
AWS提供了常用的ReginEndPoint,但若對接方提供了自定義Region,則需通過如下配置獲取RegionEndPoint
var clientConfig = new AmazonS3Config { RegionEndpoint = RegionEndpoint.GetBySystemName(awsRegion), ServiceURL = awsEndPoint };
此時再執行將會丟擲如下異常:
此時針對上述訪問配置,繼續配置ForcePathStyle為true,說明請求都將採用路徑風格地址,據猜測我們使用指定域名(ServiceURL)來傳送請求,所以應該必須指定此屬性。
var clientConfig = new AmazonS3Config { RegionEndpoint = RegionEndpoint.GetBySystemName(awsRegion), ServiceURL = awsEndPoint, ForcePathStyle = true };
總結
利用.NET Core在AWS S3儲存物件時暫遇到或需注意上述兩個小問題,在此做一記錄,若能幫到有需要的童鞋,將再好不過了。