|
6 | 6 |
|
7 | 7 | namespace Qiniu.Storage |
8 | 8 | { |
| 9 | + internal class ZoneCacheValue |
| 10 | + { |
| 11 | + public DateTime Deadline { get; set; } |
| 12 | + public Zone Zone { get; set; } |
| 13 | + } |
| 14 | + |
9 | 15 | /// <summary> |
10 | 16 | /// Zone辅助类,查询及配置Zone |
11 | 17 | /// </summary> |
12 | 18 | public class ZoneHelper |
13 | 19 | { |
14 | | - private static Dictionary<string, Zone> zoneCache = new Dictionary<string, Zone>(); |
| 20 | + private static Dictionary<string, ZoneCacheValue> zoneCache = new Dictionary<string, ZoneCacheValue>(); |
15 | 21 | private static object rwLock = new object(); |
16 | 22 |
|
17 | 23 | /// <summary> |
18 | | - /// 从uc.qbox.me查询得到回复后,解析出upHost,然后根据upHost确定Zone |
| 24 | + /// 从 UC 服务查询得到各个服务域名,生成 Zone 对象并返回 |
19 | 25 | /// </summary> |
20 | | - /// <param name="accessKey">AccessKek</param> |
| 26 | + /// <param name="accessKey">AccessKey</param> |
21 | 27 | /// <param name="bucket">空间名称</param> |
22 | | - public static Zone QueryZone(string accessKey, string bucket) |
| 28 | + /// <param name="ucHost">UC 域名</param> |
| 29 | + public static Zone QueryZone(string accessKey, string bucket, string ucHost = null) |
23 | 30 | { |
24 | | - Zone zone = null; |
25 | | - |
| 31 | + ZoneCacheValue zoneCacheValue = null; |
26 | 32 | string cacheKey = string.Format("{0}:{1}", accessKey, bucket); |
27 | 33 |
|
28 | 34 | //check from cache |
29 | 35 | lock (rwLock) |
30 | 36 | { |
31 | 37 | if (zoneCache.ContainsKey(cacheKey)) |
32 | 38 | { |
33 | | - zone = zoneCache[cacheKey]; |
| 39 | + zoneCacheValue = zoneCache[cacheKey]; |
34 | 40 | } |
35 | 41 | } |
36 | 42 |
|
37 | | - if (zone != null) |
| 43 | + if ( |
| 44 | + zoneCacheValue != null && |
| 45 | + DateTime.Now < zoneCacheValue.Deadline && |
| 46 | + zoneCacheValue.Zone != null |
| 47 | + ) |
38 | 48 | { |
39 | | - return zone; |
| 49 | + return zoneCacheValue.Zone; |
40 | 50 | } |
41 | 51 |
|
42 | 52 | //query from uc api |
| 53 | + Zone zone; |
43 | 54 | HttpResult hr = null; |
| 55 | + if (String.IsNullOrEmpty(ucHost)) |
| 56 | + { |
| 57 | + ucHost = "https://" + Config.DefaultUcHost; |
| 58 | + } |
44 | 59 | try |
45 | 60 | { |
46 | | - string queryUrl = string.Format("https://uc.qbox.me/v2/query?ak={0}&bucket={1}", accessKey, bucket); |
| 61 | + string queryUrl = string.Format("{0}/v4/query?ak={1}&bucket={2}", |
| 62 | + ucHost, |
| 63 | + accessKey, |
| 64 | + bucket |
| 65 | + ); |
47 | 66 | HttpManager httpManager = new HttpManager(); |
48 | 67 | hr = httpManager.Get(queryUrl, null); |
49 | | - if (hr.Code == (int)HttpCode.OK) |
| 68 | + if (hr.Code != (int) HttpCode.OK || string.IsNullOrEmpty(hr.Text)) |
50 | 69 | { |
51 | | - ZoneInfo zInfo = JsonConvert.DeserializeObject<ZoneInfo>(hr.Text); |
52 | | - if (zInfo != null) |
53 | | - { |
54 | | - zone = new Zone(); |
55 | | - zone.SrcUpHosts = zInfo.Up.Src.Main; |
56 | | - zone.CdnUpHosts = zInfo.Up.Acc.Main; |
57 | | - zone.IovipHost = zInfo.Io.Src.Main[0]; |
58 | | - if (zone.IovipHost.Contains("z1")) |
59 | | - { |
60 | | - zone.ApiHost = "api-z1.qiniuapi.com"; |
61 | | - zone.RsHost = "rs-z1.qiniu.com"; |
62 | | - zone.RsfHost = "rsf-z1.qiniu.com"; |
63 | | - } |
64 | | - else if (zone.IovipHost.Contains("z2")) |
65 | | - { |
66 | | - zone.ApiHost = "api-z2.qiniuapi.com"; |
67 | | - zone.RsHost = "rs-z2.qiniu.com"; |
68 | | - zone.RsfHost = "rsf-z2.qiniu.com"; |
69 | | - } |
70 | | - else if (zone.IovipHost.Contains("na0")) |
71 | | - { |
72 | | - zone.ApiHost = "api-na0.qiniuapi.com"; |
73 | | - zone.RsHost = "rs-na0.qiniu.com"; |
74 | | - zone.RsfHost = "rsf-na0.qiniu.com"; |
75 | | - } |
76 | | - else if (zone.IovipHost.Contains("as0")) |
77 | | - { |
78 | | - zone.ApiHost = "api-as0.qiniuapi.com"; |
79 | | - zone.RsHost = "rs-as0.qiniu.com"; |
80 | | - zone.RsfHost = "rsf-as0.qiniu.com"; |
81 | | - } |
82 | | - else if (zone.IovipHost.Contains("cn-east-2")) |
83 | | - { |
84 | | - zone.ApiHost = "api-cn-east-2.qiniuapi.com"; |
85 | | - zone.RsHost = "rs-cn-east-2.qiniuapi.com"; |
86 | | - zone.RsfHost = "rsf-cn-east-2.qiniuapi.com"; |
87 | | - } |
88 | | - else if (zone.IovipHost.Contains("ap-northeast-1")) |
89 | | - { |
90 | | - zone.ApiHost = "api-ap-northeast-1.qiniuapi.com"; |
91 | | - zone.RsHost = "rs-ap-northeast-1.qiniuapi.com"; |
92 | | - zone.RsfHost = "rsf-ap-northeast-1.qiniuapi.com"; |
93 | | - } |
94 | | - else |
95 | | - { |
96 | | - zone.ApiHost = "api.qiniuapi.com"; |
97 | | - zone.RsHost = "rs.qiniu.com"; |
98 | | - zone.RsfHost = "rsf.qiniu.com"; |
99 | | - } |
100 | | - |
101 | | - lock (rwLock) |
102 | | - { |
103 | | - zoneCache[cacheKey] = zone; |
104 | | - } |
105 | | - } |
106 | | - else |
107 | | - { |
108 | | - throw new Exception("JSON Deserialize failed: " + hr.Text); |
109 | | - } |
| 70 | + throw new Exception("code: " + hr.Code + ", text: " + hr.Text + ", ref-text:" + hr.RefText); |
| 71 | + } |
| 72 | + |
| 73 | + ZoneInfo zInfo = JsonConvert.DeserializeObject<ZoneInfo>(hr.Text); |
| 74 | + if (zInfo == null) |
| 75 | + { |
| 76 | + throw new Exception("JSON Deserialize failed: " + hr.Text); |
| 77 | + } |
| 78 | + |
| 79 | + if (zInfo.Hosts.Length == 0) |
| 80 | + { |
| 81 | + throw new Exception("There are no hosts available: " + hr.Text); |
| 82 | + } |
| 83 | + |
| 84 | + ZoneHost zHost = zInfo.Hosts[0]; |
| 85 | + |
| 86 | + zone = new Zone(); |
| 87 | + zone.SrcUpHosts = zHost.Up.Domains; |
| 88 | + zone.CdnUpHosts = zHost.Up.Domains; |
| 89 | + |
| 90 | + if (!string.IsNullOrEmpty(zHost.Io.Domains[0])) |
| 91 | + { |
| 92 | + zone.IovipHost = zHost.Io.Domains[0]; |
110 | 93 | } |
111 | 94 | else |
112 | 95 | { |
113 | | - throw new Exception("code: " + hr.Code + ", text: " + hr.Text + ", ref-text:" + hr.RefText); |
| 96 | + zone.IovipHost = Config.DefaultIoHost; |
| 97 | + } |
| 98 | + |
| 99 | + if (!string.IsNullOrEmpty(zHost.Api.Domains[0])) |
| 100 | + { |
| 101 | + zone.ApiHost = zHost.Api.Domains[0]; |
| 102 | + } |
| 103 | + else |
| 104 | + { |
| 105 | + zone.ApiHost = Config.DefaultApiHost; |
| 106 | + } |
| 107 | + |
| 108 | + if (!string.IsNullOrEmpty(zHost.Rs.Domains[0])) |
| 109 | + { |
| 110 | + zone.RsHost = zHost.Rs.Domains[0]; |
| 111 | + } |
| 112 | + else |
| 113 | + { |
| 114 | + zone.RsHost = Config.DefaultRsHost; |
| 115 | + } |
| 116 | + |
| 117 | + if (!string.IsNullOrEmpty(zHost.Rsf.Domains[0])) |
| 118 | + { |
| 119 | + zone.RsfHost = zHost.Rsf.Domains[0]; |
| 120 | + } |
| 121 | + else |
| 122 | + { |
| 123 | + zone.RsfHost = Config.DefaultRsfHost; |
| 124 | + } |
| 125 | + |
| 126 | + lock (rwLock) |
| 127 | + { |
| 128 | + zoneCacheValue = new ZoneCacheValue(); |
| 129 | + TimeSpan ttl = TimeSpan.FromSeconds(zHost.Ttl); |
| 130 | + zoneCacheValue.Deadline = DateTime.Now.Add(ttl); |
| 131 | + zoneCacheValue.Zone = zone; |
| 132 | + zoneCache[cacheKey] = zoneCacheValue; |
114 | 133 | } |
115 | 134 | } |
116 | 135 | catch (Exception ex) |
|
0 commit comments