66
77namespace Qiniu . Storage
88{
9+ internal class ZoneCacheValue
10+ {
11+ public DateTime Deadline { get ; set ; }
12+ public Zone Zone { get ; set ; }
13+ }
14+
915 /// <summary>
1016 /// Zone辅助类,查询及配置Zone
1117 /// </summary>
1218 public class ZoneHelper
1319 {
14- private static Dictionary < string , Zone > zoneCache = new Dictionary < string , Zone > ( ) ;
20+ private static Dictionary < string , ZoneCacheValue > zoneCache = new Dictionary < string , ZoneCacheValue > ( ) ;
1521 private static object rwLock = new object ( ) ;
1622
1723 /// <summary>
@@ -21,86 +27,91 @@ public class ZoneHelper
2127 /// <param name="bucket">空间名称</param>
2228 public static Zone QueryZone ( string accessKey , string bucket )
2329 {
24- Zone zone = null ;
25-
30+ ZoneCacheValue zoneCacheValue = null ;
2631 string cacheKey = string . Format ( "{0}:{1}" , accessKey , bucket ) ;
2732
2833 //check from cache
2934 lock ( rwLock )
3035 {
3136 if ( zoneCache . ContainsKey ( cacheKey ) )
3237 {
33- zone = zoneCache [ cacheKey ] ;
38+ zoneCacheValue = zoneCache [ cacheKey ] ;
3439 }
3540 }
3641
37- if ( zone != null )
42+ if (
43+ zoneCacheValue != null &&
44+ DateTime . Now < zoneCacheValue . Deadline &&
45+ zoneCacheValue . Zone != null
46+ )
3847 {
39- return zone ;
48+ return zoneCacheValue . Zone ;
4049 }
4150
4251 //query from uc api
52+ Zone zone ;
4353 HttpResult hr = null ;
4454 try
4555 {
46- string queryUrl = string . Format ( "https://uc.qbox.me/v2/query?ak={0}&bucket={1}" , accessKey , bucket ) ;
56+ string queryUrl = string . Format ( "https://{0}/v2/query?ak={1}&bucket={2}" ,
57+ Config . DefaultUcHost ,
58+ accessKey ,
59+ bucket
60+ ) ;
4761 HttpManager httpManager = new HttpManager ( ) ;
4862 hr = httpManager . Get ( queryUrl , null ) ;
49- if ( hr . Code == ( int ) HttpCode . OK )
63+ if ( hr . Code == ( int ) HttpCode . OK && ! string . IsNullOrEmpty ( hr . Text ) )
5064 {
5165 ZoneInfo zInfo = JsonConvert . DeserializeObject < ZoneInfo > ( hr . Text ) ;
5266 if ( zInfo != null )
5367 {
5468 zone = new Zone ( ) ;
5569 zone . SrcUpHosts = zInfo . Up . Src . Main ;
5670 zone . CdnUpHosts = zInfo . Up . Acc . Main ;
57- zone . IovipHost = zInfo . Io . Src . Main [ 0 ] ;
58- if ( zone . IovipHost . Contains ( "z1" ) )
71+
72+ if ( ! string . IsNullOrEmpty ( zInfo . Io . Src . Main [ 0 ] ) )
73+ {
74+ zone . IovipHost = zInfo . Io . Src . Main [ 0 ] ;
75+ }
76+ else
5977 {
60- zone . ApiHost = "api-z1.qiniuapi.com" ;
61- zone . RsHost = "rs-z1.qiniu.com" ;
62- zone . RsfHost = "rsf-z1.qiniu.com" ;
78+ zone . IovipHost = Config . DefaultIoHost ;
6379 }
64- else if ( zone . IovipHost . Contains ( "z2" ) )
80+
81+ if ( ! string . IsNullOrEmpty ( zInfo . Api . Acc . Main [ 0 ] ) )
6582 {
66- zone . ApiHost = "api-z2.qiniuapi.com" ;
67- zone . RsHost = "rs-z2.qiniu.com" ;
68- zone . RsfHost = "rsf-z2.qiniu.com" ;
83+ zone . ApiHost = zInfo . Api . Acc . Main [ 0 ] ;
6984 }
70- else if ( zone . IovipHost . Contains ( "na0" ) )
85+ else
7186 {
72- zone . ApiHost = "api-na0.qiniuapi.com" ;
73- zone . RsHost = "rs-na0.qiniu.com" ;
74- zone . RsfHost = "rsf-na0.qiniu.com" ;
87+ zone . ApiHost = Config . DefaultApiHost ;
7588 }
76- else if ( zone . IovipHost . Contains ( "as0" ) )
89+
90+ if ( ! string . IsNullOrEmpty ( zInfo . Rs . Acc . Main [ 0 ] ) )
7791 {
78- zone . ApiHost = "api-as0.qiniuapi.com" ;
79- zone . RsHost = "rs-as0.qiniu.com" ;
80- zone . RsfHost = "rsf-as0.qiniu.com" ;
92+ zone . RsHost = zInfo . Rs . Acc . Main [ 0 ] ;
8193 }
82- else if ( zone . IovipHost . Contains ( "cn-east-2" ) )
94+ else
8395 {
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" ;
96+ zone . RsHost = Config . DefaultRsHost ;
8797 }
88- else if ( zone . IovipHost . Contains ( "ap-northeast-1" ) )
98+
99+ if ( ! string . IsNullOrEmpty ( zInfo . Rsf . Acc . Main [ 0 ] ) )
89100 {
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" ;
101+ zone . RsfHost = zInfo . Rsf . Acc . Main [ 0 ] ;
93102 }
94103 else
95104 {
96- zone . ApiHost = "api.qiniuapi.com" ;
97- zone . RsHost = "rs.qiniu.com" ;
98- zone . RsfHost = "rsf.qiniu.com" ;
105+ zone . RsfHost = Config . DefaultRsfHost ;
99106 }
100107
101108 lock ( rwLock )
102109 {
103- zoneCache [ cacheKey ] = zone ;
110+ zoneCacheValue = new ZoneCacheValue ( ) ;
111+ TimeSpan ttl = TimeSpan . FromSeconds ( zInfo . Ttl ) ;
112+ zoneCacheValue . Deadline = DateTime . Now . Add ( ttl ) ;
113+ zoneCacheValue . Zone = zone ;
114+ zoneCache [ cacheKey ] = zoneCacheValue ;
104115 }
105116 }
106117 else
0 commit comments