Skip to content

Commit 03540c8

Browse files
committed
first upload
1 parent 8c49731 commit 03540c8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+4346
-0
lines changed

Api/Base/BaseObjectCommand.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using Cuiliang.AliyunOssSdk.Entites;
2+
using Cuiliang.AliyunOssSdk.Request;
3+
4+
namespace Cuiliang.AliyunOssSdk.Api.Base
5+
{
6+
/// <summary>
7+
/// 对某个对象进行的操作的命令基类,主要是保存了Bucket信息和key
8+
/// </summary>
9+
/// <typeparam name="TResult"></typeparam>
10+
public abstract class BaseObjectCommand<TResult>: BaseOssCommand<TResult>
11+
{
12+
/// <summary>
13+
/// 对象所处的Bucket
14+
/// </summary>
15+
public BucketInfo Bucket { get; set; }
16+
17+
/// <summary>
18+
/// 目标对象的Key
19+
/// </summary>
20+
public string Key { get; set; }
21+
22+
public BaseObjectCommand(RequestContext requestContext,
23+
BucketInfo bucket,
24+
string key) : base(requestContext)
25+
{
26+
Bucket = bucket;
27+
Key = key;
28+
}
29+
}
30+
}

Api/Base/BaseOssCommand.cs

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
using System;
2+
using System.Net;
3+
using System.Net.Http;
4+
using System.Threading.Tasks;
5+
using Cuiliang.AliyunOssSdk.Api.Common.Consts;
6+
using Cuiliang.AliyunOssSdk.Entites;
7+
using Cuiliang.AliyunOssSdk.Request;
8+
using Cuiliang.AliyunOssSdk.Utility;
9+
10+
namespace Cuiliang.AliyunOssSdk.Api.Base
11+
{
12+
/// <summary>
13+
/// OSS API命令基类,负责构建request,并对结果进行解析
14+
/// </summary>
15+
/// <typeparam name="TResult"></typeparam>
16+
public abstract class BaseOssCommand<TResult>
17+
{
18+
protected RequestContext RequestContext { get; private set; }
19+
20+
public BaseOssCommand(RequestContext requestContext)
21+
{
22+
RequestContext = requestContext;
23+
}
24+
25+
/// <summary>
26+
/// 构造Request请求,由派生类实现
27+
/// </summary>
28+
/// <returns></returns>
29+
public abstract ServiceRequest BuildRequest();
30+
31+
/// <summary>
32+
/// 解析结果对象。基类提供通用方式处理:解析xml。对于特殊返回结果,定义重载函数来进行处理。
33+
/// </summary>
34+
/// <param name="response"></param>
35+
/// <returns></returns>
36+
public virtual async Task<OssResult<TResult>> ParseResultAsync(HttpResponseMessage response)
37+
{
38+
//成功情况下的默认解析处理
39+
var length = response.Content?.Headers?.ContentLength;
40+
if (length > 0)
41+
{
42+
var result = SerializeHelper.Deserialize<TResult>(await response.Content.ReadAsStreamAsync());
43+
var ossResult = new OssResult<TResult>()
44+
{
45+
IsSuccess = true,
46+
SuccessResult = result
47+
};
48+
49+
return ossResult;
50+
}
51+
52+
return new OssResult<TResult>()
53+
{
54+
IsSuccess = false,
55+
ErrorMessage = "ContentLength = 0"
56+
};
57+
}
58+
59+
/// <summary>
60+
/// 执行请求并返回结果
61+
/// </summary>
62+
/// <returns></returns>
63+
public async Task<OssResult<TResult>> ExecuteAsync()
64+
{
65+
try
66+
{
67+
ServiceRequest request = BuildRequest();
68+
69+
//加入dateheader
70+
request.Headers[HttpHeaders.Date] = DateUtils.FormatRfc822Date(DateTime.UtcNow);
71+
72+
73+
if (RequestContext.OssCredential.UseToken)
74+
{
75+
request.Headers[HttpHeaders.SecurityToken] = RequestContext.OssCredential.SecurityToken;
76+
}
77+
78+
79+
// 发送请求
80+
var caller = new ServiceCaller(RequestContext);
81+
HttpResponseMessage response = await caller.CallServiceAsync(request);
82+
83+
// 解析结果
84+
return await ProcessResponseInternal(response);
85+
}
86+
catch (Exception ex)
87+
{
88+
return new OssResult<TResult>()
89+
{
90+
IsSuccess = false,
91+
InnerException = ex,
92+
ErrorMessage = ex.Message
93+
};
94+
}
95+
96+
}
97+
98+
/// <summary>
99+
/// 初步处理返回的结果,对于失败的http代码,进行错误解析处理
100+
/// </summary>
101+
/// <param name="response"></param>
102+
/// <returns></returns>
103+
private async Task<OssResult<TResult>> ProcessResponseInternal(HttpResponseMessage response)
104+
{
105+
if (response.IsSuccessStatusCode)
106+
{
107+
return await ParseResultAsync(response);
108+
}
109+
else if (response.StatusCode == HttpStatusCode.NotModified) //此处处理是参考官方的sdk
110+
{
111+
return new OssResult<TResult>()
112+
{
113+
IsSuccess = false,
114+
ErrorMessage = "NOT_MODIFIED"
115+
};
116+
}else
117+
{
118+
//错误的http代码
119+
if (response.Content?.Headers.ContentLength > 0)
120+
{
121+
var errorResult =
122+
SerializeHelper.Deserialize<ErrorResult>(await response.Content.ReadAsStreamAsync());
123+
124+
return new OssResult<TResult>()
125+
{
126+
IsSuccess = false,
127+
ErrorResult = errorResult,
128+
ErrorMessage = errorResult.Message
129+
};
130+
}
131+
132+
return new OssResult<TResult>()
133+
{
134+
IsSuccess = false,
135+
ErrorMessage = "STATUSCODE:" + response.StatusCode
136+
};
137+
}
138+
}
139+
}
140+
}

Api/Bucket/List/ListBucketCommand.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.Net.Http;
2+
using Cuiliang.AliyunOssSdk.Api.Base;
3+
using Cuiliang.AliyunOssSdk.Api.Common.Consts;
4+
using Cuiliang.AliyunOssSdk.Entites;
5+
using Cuiliang.AliyunOssSdk.Request;
6+
7+
namespace Cuiliang.AliyunOssSdk.Api.Bucket.List
8+
{
9+
public class ListBucketCommand: BaseOssCommand<ListBucketsResult>
10+
{
11+
private ListBucketsRequest _request;
12+
private string _region;
13+
14+
public ListBucketCommand(RequestContext requestContext, string region, ListBucketsRequest request) : base(requestContext)
15+
{
16+
_request = request;
17+
_region = region;
18+
}
19+
20+
public override ServiceRequest BuildRequest()
21+
{
22+
23+
var req = new ServiceRequest(BucketInfo.CreateByRegion(_region, ""), "", HttpMethod.Get);
24+
25+
//
26+
req.AddParameter(RequestParameters.PREFIX, _request.Prefix);
27+
req.AddParameter(RequestParameters.MARKER, _request.Marker);
28+
req.AddParameter(RequestParameters.MAX_KEYS, _request.MaxKeys?.ToString());
29+
30+
return req;
31+
}
32+
33+
}
34+
}

Api/Bucket/List/ListBucketsRequest.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright (C) Alibaba Cloud Computing
3+
* All rights reserved.
4+
*
5+
* 版权所有 (C)阿里云计算有限公司
6+
*/
7+
8+
using Cuiliang.AliyunOssSdk.Api.Common;
9+
10+
namespace Cuiliang.AliyunOssSdk.Api.Bucket.List
11+
{
12+
/// <summary>
13+
/// 包含获取<see cref="Bucket" />列表的请求信息。
14+
/// </summary>
15+
public class ListBucketsRequest
16+
{
17+
/// <summary>
18+
/// 获取或设置一个值,限定返回的<see cref="Bucket" />的Key必须以该值作为前缀。
19+
/// </summary>
20+
public string Prefix { get; set; }
21+
22+
/// <summary>
23+
/// 获取或设置一个值,用户设定结果从该值之后按字母排序的第一个开始返回。
24+
/// </summary>
25+
public string Marker { get; set; }
26+
27+
/// <summary>
28+
/// 获取或设置一个值,用于限定此次返回bucket的最大数。
29+
/// 如果不设定,默认为100。
30+
/// </summary>
31+
public int? MaxKeys { get; set; }
32+
}
33+
}

Api/Bucket/List/ListBucketsResult.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright (C) Alibaba Cloud Computing
3+
* All rights reserved.
4+
*
5+
* 版权所有 (C)阿里云计算有限公司
6+
*/
7+
8+
using System;
9+
using System.Collections.Generic;
10+
using System.Xml.Serialization;
11+
using Cuiliang.AliyunOssSdk.Api.Common;
12+
13+
namespace Cuiliang.AliyunOssSdk.Api.Bucket.List
14+
{
15+
/// <summary>
16+
/// 列举Bucket的请求结果。
17+
/// </summary>
18+
[XmlRoot("ListAllMyBucketsResult")]
19+
public class ListBucketsResult
20+
{
21+
/// <summary>
22+
/// 获取一个值,限定返回的<see cref="Bucket" />的Key必须以该值作为前缀。
23+
/// </summary>
24+
public string Prefix { get; set; }
25+
26+
/// <summary>
27+
/// 获取一个值,用户设定结果从该值之后按字母排序的第一个开始返回。
28+
/// </summary>
29+
public string Marker { get; set; }
30+
31+
/// <summary>
32+
/// 获取一个值,用于限定此次返回bucket的最大数。
33+
/// 如果不设定,默认为100。
34+
/// </summary>
35+
public int? MaxKeys { get; set; }
36+
37+
/// <summary>
38+
/// 获取一个值,指明是否所有的结果都已经返回。
39+
/// </summary>
40+
public bool? IsTruncated { get; set; }
41+
42+
/// <summary>
43+
/// 获取一个值,指明下一个Marker。
44+
/// </summary>
45+
public string NextMaker { get; set; }
46+
47+
[XmlElement("Owner")]
48+
public Owner Owner { get; set; }
49+
50+
/// <summary>
51+
/// 获取一个值,指明Bucket请求列表。
52+
/// </summary>
53+
[XmlArrayItem("Bucket")]
54+
public List<Common.Bucket> Buckets { get; set; }
55+
}
56+
57+
[XmlRoot("Bucket")]
58+
public class BucketModel
59+
{
60+
[XmlElement("Location")]
61+
public string Location { get; set; }
62+
63+
[XmlElement("Name")]
64+
public string Name { get; set; }
65+
66+
[XmlElement("CreationDate")]
67+
public DateTime CreationDate { get; set; }
68+
69+
public string ExtranetEndpoint { get; set; }
70+
71+
public string IntranetEndpoint { get; set; }
72+
}
73+
74+
75+
}

Api/Common/Bucket.cs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
///Copyright (C) Alibaba Cloud Computing
3+
///All rights reserved.
4+
///
5+
///版权所有 (C)阿里云计算有限公司
6+
*/
7+
8+
using System;
9+
using System.Globalization;
10+
11+
namespace Cuiliang.AliyunOssSdk.Api.Common
12+
{
13+
///<summary>
14+
///Bucket是OSS上的命名空间,可以理解为存储空间
15+
///</summary>
16+
/// <remarks>
17+
///<para>
18+
///Bucket名在整个 OSS 中具有全局唯一性,且不能修改;存储在OSS上的每个Object必须都包含在某个Bucket中。
19+
///一个应用,例如图片分享网站,可以对应一个或多个 Bucket。一个用户最多可创建 10 个Bucket,
20+
///但每个Bucket 中存放的Object的数量和大小总和没有限制,用户不需要考虑数据的可扩展性。
21+
///</para>
22+
///<para>
23+
///Bucket 命名规范
24+
///<list type="">
25+
/// <item>只能包括小写字母,数字和短横线(-)</item>
26+
/// <item>必须以小写字母或者数字开头</item>
27+
/// <item>长度必须在 3-63 字节之间</item>
28+
///</list>
29+
///</para>
30+
/// </remarks>
31+
public class Bucket
32+
{
33+
/// <summary>
34+
/// 获取/设置Bucket的Location。
35+
/// </summary>
36+
public string Location { get; set; }
37+
38+
/// <summary>
39+
/// 获取/设置Bucket的名称。
40+
/// </summary>
41+
public string Name { get; set; }
42+
43+
/// <summary>
44+
/// 获取/设置Bucket的<see cref="Owner" />
45+
/// </summary>
46+
public Owner Owner { get; set; }
47+
48+
/// <summary>
49+
/// 获取/设置Bucket的创建时间。
50+
/// </summary>
51+
public DateTime CreationDate { get; set; }
52+
53+
public Bucket()
54+
{
55+
}
56+
57+
/// <summary>
58+
/// 使用指定的Bucket名称构造一个新的<see cref="Bucket" />实例。
59+
/// </summary>
60+
/// <param name="name">Bucket的名称。</param>
61+
public Bucket(string name)
62+
{
63+
Name = name;
64+
}
65+
66+
/// <summary>
67+
/// 返回该对象的字符串表示。
68+
/// </summary>
69+
/// <returns>对象的字符串表示形式</returns>
70+
public override string ToString()
71+
{
72+
return string.Format(CultureInfo.InvariantCulture,
73+
"OSS Bucket [Name={0}], [Location={1}] [Owner={2}], [CreationTime={3}]",
74+
Name, Location, Owner, CreationDate);
75+
}
76+
77+
}
78+
}

0 commit comments

Comments
 (0)