|
關于如何解決分布式系統(tǒng)中的跨時區(qū)問題,上一篇詳細介紹了解決方案的實現(xiàn)原理,在這一篇中我們通過一個完整的例子來對這個問題進行深入探討。盡管《原理篇》中介紹了那么多,解決方案的本質(zhì)就是:在進行服務調(diào)用過程中將客戶端的時區(qū)信息作為上下文傳入服務端,并以此作為時間轉(zhuǎn)換的依據(jù)。我們首先定一個具體的類型來定義包含時區(qū)信息的上下文類型,我們將這個類型起名為ApplicationContext。
一、通過CallContext實現(xiàn)ApplicationContext
在《通過WCF擴展實現(xiàn)Context信息的傳遞》一文中,我通過HttpSessionState和CallContext實現(xiàn)了一個ApplicationContext類,為ASP.NET和其他類型的應用提供上下文信息的容器。在這里進行了簡化,僅僅實現(xiàn)了基于CallContext的部分。這樣一個ApplicationContext類型定義如下:
1: [CollectionDataContract(Namespace="http://www.artech.com/")]
2: public class ApplicationContext:Dictionary<string, object>
3: {
4: internal const string contextHeaderName = "ApplicationContext";
5: internal const string contextHeaderNamespace = "http://www.artech.com/";
6:
7: private ApplicationContext() { }
8: public static ApplicationContext Current
9: {
10: get
11: {
12: if (null == CallContext.GetData(typeof(ApplicationContext).FullName))
13: {
14: lock (typeof(ApplicationContext))
15: {
16: if (null == CallContext.GetData(typeof(ApplicationContext).FullName))
17: {
18: var context = new ApplicationContext();
19: context.TimeZone = TimeZoneInfo.Local;
20: CallContext.SetData(typeof(ApplicationContext).FullName, context);
21: }
22: }
23: }
24:
25: return (ApplicationContext)CallContext.GetData(typeof(ApplicationContext).FullName);
26: }
27: set
28: {
29: CallContext.SetData(typeof(ApplicationContext).FullName, value);
30: }
31: }
32: public TimeZoneInfo TimeZone
33: {
34: get
35: {
36: return TimeZoneInfo.FromSerializedString((string)this["__TimeZone"]);
37: }
38: set
39: {
40: this["__TimeZone"] = value.ToSerializedString();
41: }
42: }
43:
44: public static void Clear()
45: {
46: CallContext.FreeNamedDataSlot(typeof(ApplicationContext).FullName);
47: }
48: }
NET技術:如何解決分布式系統(tǒng)中的跨時區(qū)問題[實例篇],轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。