WCF 服務的集合管理器的設計

    今天是2019年2月1日,時間過得針對,立刻就年末了,當前新年也離咱們愈來愈近了。在此,我也祝福常常瀏覽我博客的朋友們「新年快樂、闔家歡樂」,來年有一個好彩頭。在即將結束這一年之計,寫今年的最後一片文章。WCF 我相信你們都使用過,每次宿主該服務的時候都要使用 ServiceHost,若是要加載多個 WCF 服務,那就須要屢次 ServiceHost 實例化,並且這個過程大體都是同樣的,這就有點太麻煩了。正好如今有時間,也有項目的須要,我就寫了一份 WCF 服務的集合管理器,能夠加載多個 WCF 服務,也能夠對 WCF 的服務進行開啓或者關閉的操做,使用起來仍是比較方便的。這個設計已經改過屢次,如今這個版本是目前最合適、最穩定的版本。編程

    說寫就寫,OO的三大基本原則,一、面向抽象編程,不要面向實現編程;二、多組合少繼承;三、哪裏有變化點就封裝哪裏。數組

    這三大原則咱們要死死的記在內心,融化進血液裏,由此,個人作法是作接口的抽象設計,代碼以下:服務器

    

    一、接口 IWcfServiceManager 的設計以下:函數

 1     /// <summary>
 2     /// WCF 服務的實例管理器,該類型能夠實現對容器內部的 WCF 服務對象進行增長、刪除、查詢、開啓和關閉的操做。
 3     /// </summary>
 4     public interface IWcfServiceManager:IDisposable
 5     {
 6         /// <summary>
 7         /// 以指定的名稱增長 WCF 服務實例,可是該服務並無啓動。
 8         /// </summary>
 9         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
10         /// <returns>返回布爾值,true 表示增長 WCF 服務成功,false 表示增長 WCF 失敗。</returns>
11         bool AddService(string serviceName);
12 
13         /// <summary>
14         /// 從容器對象中刪除指定名稱的 WCF 服務實例。
15         /// </summary>
16         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
17         /// <returns>返回布爾值,true 表示刪除 WCF 服務成功,false 表示刪除 WCF 服務失敗。</returns>
18         bool RemoveService(string serviceName);
19 
20         /// <summary>
21         /// 獲取全部的 WCF 服務實例的集合。
22         /// </summary>
23         /// <returns>返回全部的 WCF 服務實例集合。</returns>
24         IEnumerable<WcfService> GetServices();
25 
26         /// <summary>
27         /// 根據指定的名稱獲取 WCF 服務實例。
28         /// </summary>
29         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
30         /// <returns>返回和指定名稱相匹配的 WCF 服務實例,若是不存在則會返回 Null 值。</returns>
31         WcfService GetService(string serviceName);
32 
33         /// <summary>
34         /// 開啓指定名稱 WCF 服務實例,此時該服務能夠爲客戶端提供服務了。
35         /// </summary>
36         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
37         /// <returns>返回布爾值,true 表示成功開啓 WCF 服務,false 表示開啓式 WCF 服務失敗。</returns>
38         bool Start(string serviceName);
39 
40         /// <summary>
41         /// 開啓全部的 WCF 服務實例。
42         /// </summary>
43         void StartAll();
44 
45         /// <summary>
46         /// 關閉指定名稱的 WCF 服務實例,此時該服務就不能爲客戶端提供任何服務了。
47         /// </summary>
48         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
49         /// <returns>返回布爾值,true 表示成功關閉 WCF 服務實例,false 表示關閉 WCF 服務實例失敗。</returns>
50         bool Close(string serviceName);
51 
52         /// <summary>
53         /// 關閉全部的 WCF 服務實例,中止全部的服務。
54         /// </summary>
55         void CloseAll();        
56 
57         /// <summary>
58         /// 根據指定的名稱來判斷該 WCF 服務實例是否已經開啓。
59         /// </summary>
60         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
61         /// <returns>返回布爾值,true 表示該名稱的 WCF 服務實例是已經開啓的,false 表示該名稱的 WCF 服務實例是未開啓的。</returns>
62         bool IsStartup(string serviceName);
63 
64         /// <summary>
65         /// 獲取 WCF 服務實例的個數
66         /// </summary>
67         int Count { get; }
68     }

        這個接口的設計就很少說了,很簡單,繼續咱們下一步。單元測試

 

    二、實現接口類的設計,類名是:WcfServiceManager.cs測試

      該類型都有詳細的備註信息,不用我多說了。this

  1     /// <summary>
  2     /// WCF 服務的實例管理器,該類型能夠實現對容器內部的 WCF 服務對象進行增長、刪除、查詢、開啓和關閉的操做。
  3     /// </summary>
  4     public abstract class WcfServiceManager : IWcfServiceManager, IDisposable
  5     {
  6         #region 私有字段
  7 
  8         private ConcurrentDictionary<string, ServiceHost> _serviceHostGroup;
  9         private ConcurrentDictionary<string, ServiceHost> _serviceHostTemp;
 10         private string[] _assemblyNames;
 11         private bool _disposed;//是否回收完畢
 12         private IList<Assembly> _assemblies;
 13 
 14         #endregion
 15 
 16         #region 構造函數
 17 
 18         /// <summary>
 19         /// 初始化 WcfServiceManager 類的實例
 20         /// </summary>        
 21         protected WcfServiceManager()
 22         {            
 23             _serviceHostGroup = new ConcurrentDictionary<string, ServiceHost>();
 24             _serviceHostTemp = new ConcurrentDictionary<string, ServiceHost>();            
 25             _assemblies = new List<Assembly>();
 26         }
 27 
 28         #endregion
 29 
 30         #region 接口方法的實現
 31 
 32         /// <summary>
 33         /// 以指定的名稱增長 WCF 服務實例,可是該服務並無啓動。
 34         /// </summary>
 35         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
 36         /// <returns>返回布爾值,true 表示增長 WCF 服務成功,false 表示增長 WCF 失敗。</returns>
 37         public bool AddService(string serviceName)
 38         {
 39             if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
 40             {
 41                 return false;
 42             }
 43             if (!_serviceHostGroup.ContainsKey(serviceName))
 44             {
 45                 Type serviceType = GetServiceTypeFromAssemblies(serviceName,_assemblies);
 46                 if (serviceType != null)
 47                 {
 48                     ServiceHost host = new ServiceHost(serviceType);
 49                     _serviceHostGroup.TryAdd(serviceName, host);
 50                     return true;
 51                 }
 52                 else
 53                 {
 54                     return false;
 55                 }
 56             }
 57             return false;
 58         }
 59 
 60         /// <summary>
 61         /// 從容器對象中刪除指定名稱的 WCF 服務實例。
 62         /// </summary>
 63         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
 64         /// <returns>返回布爾值,true 表示刪除 WCF 服務成功,false 表示刪除 WCF 服務失敗。</returns>
 65         public bool RemoveService(string serviceName)
 66         {
 67             if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
 68             {
 69                 return false;
 70             }
 71             if (_serviceHostGroup.ContainsKey(serviceName))
 72             {
 73                 ServiceHost hostInstance = null;
 74                 _serviceHostGroup.TryRemove(serviceName, out hostInstance);
 75                 if (hostInstance != null && hostInstance.State == CommunicationState.Opened)
 76                 {
 77                     hostInstance.Close();
 78                     hostInstance = null;
 79                 }
 80                 return true;
 81             }
 82             return false;
 83         }
 84 
 85         /// <summary>
 86         /// 獲取全部的 WCF 服務實例的集合。
 87         /// </summary>
 88         /// <returns>返回全部的 WCF 服務實例集合。</returns>
 89         public IEnumerable<WcfService> GetServices()
 90         {
 91             IList<WcfService> list = new List<WcfService>();
 92             if (_serviceHostGroup != null && _serviceHostGroup.Count > 0)
 93             {
 94                 foreach (var key in _serviceHostGroup.Keys)
 95                 {
 96                     var service = new WcfService();
 97                     service.ServiceName = _serviceHostGroup[key].Description.Name;
 98                     service.State = _serviceHostGroup[key].State;
 99                     service.Description = _serviceHostGroup[key].Description;
100                     list.Add(service);
101                 }
102             }
103             return list;
104         }
105 
106         /// <summary>
107         /// 根據指定的名稱獲取 WCF 服務實例。
108         /// </summary>
109         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
110         /// <returns>返回和指定名稱相匹配的 WCF 服務實例,若是不存在則會返回 Null 值。</returns>
111         public WcfService GetService(string serviceName)
112         {
113             if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
114             {
115                 throw new ArgumentNullException("要查找的 WCF 服務的名稱不能爲空!");
116             }
117             WcfService service = null;
118             if (_serviceHostGroup.ContainsKey(serviceName))
119             {
120                 service = new WcfService();
121                 service.ServiceName = _serviceHostGroup[serviceName].Description.Name;
122                 service.State = _serviceHostGroup[serviceName].State;
123                 service.Description = _serviceHostGroup[serviceName].Description;
124                 return service;
125             }
126             return service;
127         }
128 
129         /// <summary>
130         /// 清空容器中全部 WCF 服務實例。
131         /// </summary>
132         public void ClearAll()
133         {
134             if (_serviceHostGroup != null && _serviceHostGroup.Count > 0)
135             {
136                 this.CloseAll();
137                 _serviceHostGroup.Clear();
138             }
139         }
140 
141         /// <summary>
142         /// 開啓指定名稱 WCF 服務實例,此時該服務能夠爲客戶端提供服務了。
143         /// </summary>
144         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
145         /// <returns>返回布爾值,true 表示成功開啓 WCF 服務,false 表示開啓式 WCF 服務失敗。</returns>
146         public bool Start(string serviceName)
147         {
148             if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
149             {
150                 return false;
151             }
152             var serviceHost = _serviceHostGroup[serviceName];
153             if (serviceHost != null)
154             {
155                 if (serviceHost.State == CommunicationState.Created && serviceHost.State != CommunicationState.Faulted)
156                 {
157                     serviceHost.Open();
158                     return true;
159                 }
160                 else if (serviceHost.State == CommunicationState.Closed || serviceHost.State != CommunicationState.Faulted)
161                 {
162                     ServiceHost tempHost;                    
163                     _serviceHostGroup.TryRemove(serviceName,out tempHost);
164                     if (tempHost != null)
165                     {
166                         if (tempHost.State == CommunicationState.Opened)
167                         {
168                             tempHost.Close();
169                         }
170                         tempHost = null;
171                     }
172                     ServiceHost newhost = new ServiceHost(serviceHost.Description.ServiceType);
173                     newhost.Open();
174                     _serviceHostGroup.TryAdd(serviceName, newhost);
175                     return true;
176                 }
177             }
178             return false;
179         }
180 
181         /// <summary>
182         /// 開啓全部的 WCF 服務實例。
183         /// </summary>
184         public void StartAll()
185         {
186             if (_serviceHostGroup != null && _serviceHostGroup.Count > 0)
187             {
188                 foreach (ServiceHost host in _serviceHostGroup.Values)
189                 {
190                     if (host.State != CommunicationState.Opened)
191                     {
192                         if (host.State == CommunicationState.Closed)
193                         {
194                             ServiceHost newhost = new ServiceHost(host.Description.ServiceType);
195                             newhost.Open();
196                             _serviceHostTemp.TryAdd(host.Description.ConfigurationName, newhost);
197                         }
198                         else if (host.State == CommunicationState.Faulted)
199                         {
200                             ServiceHost newhost = new ServiceHost(host.Description.ServiceType);
201                             newhost.Open();
202                             _serviceHostTemp.TryAdd(host.Description.ConfigurationName, newhost);
203                         }
204                         else if (host.State == CommunicationState.Created)
205                         {
206                             host.Open();
207                         }
208                     }
209                 }
210             }
211             if (_serviceHostTemp != null && _serviceHostTemp.Count > 0)
212             {
213                 foreach (KeyValuePair<string, ServiceHost> item in _serviceHostTemp)
214                 {
215                     if (_serviceHostGroup.ContainsKey(item.Key))
216                     {
217                         if (_serviceHostGroup[item.Key].State == CommunicationState.Opened)
218                         {
219                             _serviceHostGroup[item.Key].Close();
220                         }
221                         ServiceHost tempHost;
222                         _serviceHostGroup.TryRemove(item.Key,out tempHost);
223                         if (tempHost.State != CommunicationState.Closed)
224                         {
225                             tempHost.Close();
226                             tempHost = null;
227                         }
228                         if (item.Value.State == CommunicationState.Closed)
229                         {
230                             item.Value.Open();
231                         }
232                         _serviceHostGroup.TryAdd(item.Key, item.Value);
233                     }
234                 }
235                 _serviceHostTemp.Clear();
236             }
237         }
238 
239         /// <summary>
240         /// 關閉指定名稱的 WCF 服務實例,此時該服務就不能爲客戶端提供任何服務了。
241         /// </summary>
242         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
243         /// <returns>返回布爾值,true 表示成功關閉 WCF 服務實例,false 表示關閉 WCF 服務實例失敗。</returns>
244         public bool Close(string serviceName)
245         {
246             if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
247             {
248                 return false;
249             }
250             var host = _serviceHostGroup[serviceName];
251             if (host != null)
252             {
253                 if (host.State == CommunicationState.Opened)
254                 {
255                     host.Close();                    
256                 }
257                 return true;
258             }
259             return false;
260         }
261 
262         /// <summary>
263         /// 關閉全部的 WCF 服務實例,中止全部的服務。
264         /// </summary>
265         public void CloseAll()
266         {
267             if (_serviceHostGroup != null && _serviceHostGroup.Count > 0)
268             {
269                 foreach (ServiceHost host in _serviceHostGroup.Values)
270                 {
271                     if (host.State == CommunicationState.Opened)
272                     {
273                         host.Close();
274                     }
275                 }
276             }
277         }        
278 
279         /// <summary>
280         /// 根據指定的名稱來判斷該 WCF 服務實例是否已經開啓。
281         /// </summary>
282         /// <param name="serviceName">表示 WCF 服務的名稱。</param>
283         /// <returns>返回布爾值,true 表示該名稱的 WCF 服務實例是已經開啓的,false 表示該名稱的 WCF 服務實例是未開啓的。</returns>
284         public bool IsStartup(string serviceName)
285         {
286             if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
287             {
288                 return false;
289             }
290             var host = _serviceHostGroup[serviceName];
291             if (host != null)
292             {
293                 if (host.State == CommunicationState.Opened)
294                 {
295                     return true;
296                 }
297             }
298             return false;
299         }
300 
301         /// <summary>
302         /// 從新加載全部的 WCF 服務實例,並將全部的 WCF 服務對象開啓
303         /// </summary>
304         public void Reload()
305         {
306             this.CloseAll();
307             this.ClearAll();
308             this.Initialize();
309             this.StartAll();
310         }
311 
312         /// <summary>
313         /// 獲取 WCF 服務實例的個數
314         /// </summary>
315         public int Count
316         {
317             get
318             {
319                 return _serviceHostGroup.Count;
320             }
321         }
322 
323         #endregion
324 
325         #region 定義的抽象方法
326 
327         /// <summary>
328         /// 加載全部的 WCF 服務實例對象
329         /// </summary>
330         /// <param name="assemblyFullNames">承載 WCF 服務的應用程序集的徹底限定名數組</param>
331         public void Initialize(params string[] assemblyFullNames)
332         {
333             _assemblyNames = assemblyFullNames;
334             CloseAll();
335             ClearAll();
336 
337             var currentDomainDlls = GetAssembliesFromCurrentDomain();
338             var specifiedDlls = GetAssembliesFromSpecifiedCondition(_assemblyNames);
339             foreach (var item in currentDomainDlls)
340             {
341                 _assemblies.Add(item);
342             }
343             foreach (var item in specifiedDlls)
344             {
345                 _assemblies.Add(item);
346             }
347 
348             Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);
349             ServiceModelSectionGroup serviceModelGroup = config.GetSectionGroup("system.serviceModel") as ServiceModelSectionGroup;
350             if (serviceModelGroup != null)
351             {
352                 foreach (ServiceElement service in serviceModelGroup.Services.Services)
353                 {
354                     this.AddService(service.Name);
355                 }
356             }
357         }
358 
359         /// <summary>
360         /// 根據指定的字符串類型的程序集名稱列表獲取強類型的程序集列表
361         /// </summary>
362         /// <returns>返回獲取到的強類型的程序集列表</returns>
363         protected virtual IList<Assembly> GetAssembliesFromSpecifiedCondition(params string[] assemblyNames)
364         {
365             IList<Assembly> assemblies = new List<Assembly>();
366             if (assemblyNames != null && assemblyNames.Length > 0)
367             {
368                 foreach (var item in assemblyNames)
369                 {
370                     var assembly = Assembly.Load(item);
371                     assemblies.Add(assembly);
372                 }
373             }
374             return assemblies;
375         }
376 
377         /// <summary>
378         /// 根據當前的應用程序域獲取全部必需的程序集
379         /// </summary>
380         /// <returns>返回獲取到當前應用程序域內的程序集列表</returns>
381         protected virtual IList<Assembly> GetAssembliesFromCurrentDomain()
382         {
383             IList<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => (!a.FullName.StartsWith("System", StringComparison.OrdinalIgnoreCase) && (!a.FullName.StartsWith("Microsoft", StringComparison.OrdinalIgnoreCase)) && (!a.FullName.StartsWith("mscorlib", StringComparison.OrdinalIgnoreCase)) && (!a.FullName.StartsWith("vshost32", StringComparison.OrdinalIgnoreCase)) && (!a.FullName.StartsWith("SMDiagnostics", StringComparison.OrdinalIgnoreCase)))).ToList();
384             return assemblies;
385         }
386 
387         /// <summary>
388         /// 根據 WCF 服務的名稱在當前程序域中或者傳入的程序集中查找該服務的 Type 類型的對象
389         /// </summary>
390         /// <param name="serviceName">要查找的 WCF 服務的名稱</param>
391         /// <param name="assemblies">承載 WCF 服務的程序集列表</param>
392         /// <returns>返回WCF服務的Type類型的對象,若是沒有找到相應的類型就會返回 Null 值。</returns>
393         private Type GetServiceTypeFromAssemblies(string serviceName, IList<Assembly> assemblies)
394         {
395             if (string.IsNullOrEmpty(serviceName) || string.IsNullOrWhiteSpace(serviceName))
396             {
397                 throw new ArgumentNullException("要查找的 WCF 服務的名稱");
398             }
399 
400             if (assemblies == null || assemblies.Count == 0)
401             {
402                 throw new ArgumentNullException("待查找的程序集列表不能爲空!");
403             }
404 
405             try
406             {
407                 if (assemblies != null && assemblies.Count() > 0)
408                 {
409                     var currentAssembly = assemblies.FirstOrDefault(a => a.GetType(serviceName) != null);
410                     if (currentAssembly != null)
411                     {
412                         return currentAssembly.GetType(serviceName);
413                     }
414                 }
415             }
416             catch (Exception)
417             {
418                 throw;
419             }
420             return null;
421         }
422 
423         #endregion
424 
425         #region IDispoable模式
426 
427         /// <summary>
428         /// 釋放託管資源
429         /// </summary>
430         public void Dispose()
431         {
432             Dispose(true);
433             GC.SuppressFinalize(this);
434         }
435 
436         /// <summary>
437         /// 析構函數釋放資源
438         /// </summary>
439         ~WcfServiceManager()
440         {
441             Dispose(false);
442         }
443 
444         /// <summary>
445         /// 釋放全部的託管資源和非託管資源核心方法實現
446         /// </summary>
447         /// <param name="disposing">是否須要釋放那些實現IDisposable接口的託管對象</param>
448         protected virtual void Dispose(bool disposing)
449         {
450             if (_disposed)
451             {
452                 return; //若是已經被回收,就中斷執行
453             }
454             if (disposing)
455             {
456                 //TODO:回收託管資源,調用IDisposable的Dispose()方法就能夠
457                 this.CloseAll();
458                 this.ClearAll();
459                 _serviceHostGroup = null;
460             }
461             //TODO:釋放非託管資源,設置對象爲null
462             _disposed = true;
463         }
464 
465         #endregion
466     }

 

    三、真正實現的葉子結點類型設計,類型是:DefaultWcfServiceManager.cs編碼

        該類型就是用戶將要使用的類型。spa

        

 1     /// <summary>
 2     /// WCF 服務的實例管理器,該類型能夠實現對容器內部的 WCF 服務對象進行增長、刪除、查詢、開啓和關閉的操做。
 3     /// </summary>
 4     public sealed class DefaultWcfServiceManager:WcfServiceManager, IDisposable
 5     {
 6         #region 構造函數
 7 
 8         /// <summary>
 9         /// 初始化 DefaultWcfServiceManager 類型的實例
10         /// </summary>
11         public DefaultWcfServiceManager(){ }
12 
13         #endregion
14     }

      主要的類型就差很少了。在這個設計過程當中,還會涉及到一個輔助類型 WcfService設計

 

    四、輔助類型 WcfService 的設計編碼。很簡單,直接上代碼。

      

 1     /// <summary>
 2     /// WCF 服務實例的類型的定義
 3     /// </summary>
 4     public sealed class WcfService
 5     {
 6         #region 私有字段
 7 
 8         private string _serviceName;
 9         private CommunicationState _communicationState;
10         private ServiceDescription _serviceDescription;
11 
12         #endregion
13 
14         #region 構造函數
15 
16         /// <summary>
17         /// 初始化 WcfService 類型的實例
18         /// </summary>
19         public WcfService()
20         { }
21 
22         #endregion
23 
24         #region 實例屬性
25 
26         /// <summary>
27         /// 獲取或者設置 WCF 服務實例的名稱
28         /// </summary>
29         public string ServiceName
30         {
31             get { return _serviceName; }
32             set
33             {
34                 if ((!string.IsNullOrEmpty(value)) && (!string.IsNullOrWhiteSpace(value)))
35                 {
36                     _serviceName = value;
37                 }
38             }
39         }
40 
41         /// <summary>
42         /// 獲取或者設置 WCF 的服務實例的運行狀態
43         /// </summary>
44         public CommunicationState State
45         {
46             get { return _communicationState; }
47             set { _communicationState = value; }
48         }
49         
50         /// <summary>
51         /// 獲取或者設置 WCF 服務的描述信息
52         /// </summary>
53         public ServiceDescription Description
54         {
55             get { return _serviceDescription; }
56             set
57             {
58                 if (value != null)
59                 {
60                     _serviceDescription = value;
61                 }
62             }
63         }
64 
65         #endregion
66     }

 

    五、單元測試項目代碼。

        這是最後的代碼了,有源碼沒有測試代碼,彷佛還少一點。測試代碼以下:

        

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //DefaultWcfServiceManager hosts = new DefaultWcfServiceManager("ServiceInstance, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
 6             DefaultWcfServiceManager hosts = new DefaultWcfServiceManager();
 7             hosts.Initialize("ServiceInstance, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
 8             //hosts.Initialize("ServiceInstance");
 9             string operation = "a";
10             do
11             {
12                 operation = Console.ReadLine();
13                 if (string.Compare(operation, "StartAll", true) == 0)
14                 {
15                     hosts.StartAll();
16                     Console.WriteLine("已經所有打開");
17                 }
18 
19                 if (string.Compare(operation, "ConsoleService", true) == 0)
20                 {
21                     hosts.Close("ServiceInstance.ConsoleService");
22                     Console.WriteLine("ConsoleService 已經關閉");
23                 }
24 
25                 if (string.Compare(operation, "ConsoleServiceOpen", true) == 0)
26                 {
27                     hosts.Start("ServiceInstance.ConsoleService");
28                     Console.WriteLine("ConsoleService 已經打開");
29                 }
30 
31                 if (string.Compare(operation, "MathServiceOpen", true) == 0)
32                 {
33                     hosts.Start("ServiceInstance.MathService");
34                     Console.WriteLine("MathService 已經打開");
35                 }
36 
37                 if (string.Compare(operation, "MathService", true) == 0)
38                 {
39                     hosts.Close("ServiceInstance.MathService");
40                     Console.WriteLine("MathService 已經關閉");
41                 }
42 
43                 if (string.Compare(operation, "CloseAll", true) == 0)
44                 {
45                     hosts.CloseAll();
46                     Console.WriteLine("已經所有關閉");
47                 }
48 
49                 if (string.Compare(operation, "Reload", true) == 0)
50                 {
51                     hosts.Reload();
52                     Console.WriteLine("已經所有從新打開");
53                 }
54                 if (string.Compare(operation, "print", true) == 0)
55                 {
56                     foreach (var item in hosts.GetServices())
57                     {
58                         Console.WriteLine("服務地址:" + item.Description.Endpoints[0].Address.Uri.ToString() + ";狀態:" + item.State.ToString());
59                     }
60                 }
61             } while (string.Compare(operation, "exit", true) != 0);
62         }
63     }

 

    總結:

      好了,就寫到這裏吧。要想使用 WCF ,必須的命名空間是必需要引入的 System.ServiceModel,固然這裏省略了必要的配置數據了,我相信,這個不是很難。也要說明一點,我這個項目是放在類庫裏面的,WCF 是分爲 Client 端和 Server 端的,今天只是貼出了服務器端的代碼,若是有須要,在把客戶端生成代理類的代碼貼出來。年尾了,讓很差的東西過去,讓本身迎接新的明天,不忘初心,繼續努力。

相關文章
相關標籤/搜索