<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WCF開發(fā)時(shí)如何選擇正確的實(shí)例模式(InstanceMode)?

      在使用WCF實(shí)例模型時(shí),你是否思考過這幾個(gè)的問題:
      • ”WCF中的實(shí)例模式如何正確應(yīng)用”?
      • ”使用WCF中的實(shí)例模式有何原則可以遵循嗎”? 


      眾所周知:客戶端調(diào)用服務(wù)時(shí),最終會(huì)將調(diào)用服務(wù)端的某個(gè)實(shí)例來完成。在WCF服務(wù)中,可以通過ServiceBehavior的InstanceContextMode設(shè)置服務(wù)實(shí)例。

      InstanceContextMode定義如下:

       // 摘要:
          
      //     指定可用來處理包含在傳入消息中的調(diào)用的服務(wù)實(shí)例數(shù)。
          public enum InstanceContextMode
          {
              // 摘要:
              
      //     為每個(gè)會(huì)話創(chuàng)建一個(gè)新的 System.ServiceModel.InstanceContext 對(duì)象。
              PerSession = 0,
              //
              
      // 摘要:
              
      //     新的 System.ServiceModel.InstanceContext 對(duì)象在每次調(diào)用前創(chuàng)建,在調(diào)用后回收。如果信道未創(chuàng)建會(huì)話,則該值的行為就如同
              
      //     System.ServiceModel.InstanceContextMode.PerCall 一樣。
              PerCall = 1,
              //
              
      // 摘要:
              
      //     只有一個(gè) System.ServiceModel.InstanceContext 對(duì)象用于所有傳入呼叫,并且在調(diào)用后不回收。如果服務(wù)對(duì)象不存在,則創(chuàng)建一個(gè)。
              Single = 2, } 

      既然InstanceContextMode有三個(gè)枚舉值,那就說明WCF服務(wù)端的實(shí)例有三種表現(xiàn)形式。那在平時(shí)的開發(fā)過程中,我們應(yīng)遵循什么樣的原則來采用哪種實(shí)例模式。? 

      首先看看在三種實(shí)例模式下,服務(wù)端實(shí)例具有怎樣的表現(xiàn)。 

      服務(wù)實(shí)現(xiàn):在服務(wù)的構(gòu)造函數(shù)中,初始化計(jì)數(shù)器,進(jìn)行服務(wù)調(diào)用時(shí),將計(jì)數(shù)器進(jìn)行累加輸出。如下:

      private int _counter;
      public AddService()
      {
          _counter = 0;
          Console.WriteLine("Single Mode");
      }

      public int Add(int x, int y)
      {
           Console.WriteLine("Start invoke...");
           Console.WriteLine("Invoke Thread Id is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);           
           _counter++;
           Console.WriteLine("counter is :{0}", _counter);
           return x + y;
      }


       

      1、各種實(shí)例模式的表現(xiàn) 

      PerCall模式

      客戶端調(diào)用時(shí),服務(wù)端輸出如下:

       

      可以看出:PerCall 模式下,每次進(jìn)行服務(wù)調(diào)用,實(shí)例都會(huì)進(jìn)行初始化,并且實(shí)例銷毀與服務(wù)調(diào)用是同一個(gè)線程完成的。 

      PerSession模式 

      客戶端調(diào)用時(shí),服務(wù)端輸出如下:

       

       可以看出:PerSession模式下,每次進(jìn)行服務(wù)調(diào)用,實(shí)例都會(huì)進(jìn)行初始化,但是對(duì)與每個(gè)代理,服務(wù)會(huì)使用同一個(gè)實(shí)例對(duì)象來為客戶端服務(wù)。注意:同一客戶端值的是同一個(gè)代理對(duì)象(透明代理),而不是計(jì)算機(jī)

      使用會(huì)話模式有三個(gè)要求:1、使用支持會(huì)話的綁定 ;2、契約為會(huì)話契約;3、實(shí)例模式為:PerSession

      Single模式  

      客戶端調(diào)用時(shí),服務(wù)端輸出如下:

              

       可以看出:Single模式下,所有客戶端共享同一個(gè)服務(wù)實(shí)例對(duì)象。
       

       2、如何選擇服務(wù)實(shí)例模型

       要選擇服務(wù)實(shí)例模型,首先看看這三種模型各有什么優(yōu)缺點(diǎn):

      PerCall: 

      優(yōu)點(diǎn):對(duì)于客戶端調(diào)用來說,服務(wù)不用每次為服務(wù)的調(diào)用進(jìn)行狀態(tài)的同步,因?yàn)槊看芜M(jìn)行服務(wù)調(diào)用都會(huì)要求服務(wù)重新進(jìn)行資源分配;能夠?qū)蛻舳说牟l(fā)調(diào)用即使響應(yīng)。只有在并發(fā)調(diào)用的時(shí)候,服務(wù)端才會(huì)在內(nèi)存中創(chuàng)建和維護(hù)多個(gè)服務(wù)實(shí)例。在進(jìn)行服務(wù)調(diào)用時(shí),客戶端僅僅持有服務(wù)的代理,而不會(huì)占用實(shí)際的資源,只有在發(fā)生服務(wù)調(diào)用時(shí),才會(huì)獲取資源。

      缺點(diǎn):對(duì)并行的調(diào)用需要自己進(jìn)行線程同步;由于每次調(diào)用都需要重建資源的狀態(tài),對(duì)性能有一定的影響。 

      PerCall模式下,即使不停的創(chuàng)建于銷毀服務(wù)實(shí)例,也不會(huì)釋放與客戶端的連接。因?yàn)榻⑦B接遠(yuǎn)比服務(wù)實(shí)例的創(chuàng)建于銷毀所需資源要多的多。

       

      PerSession:

       

      優(yōu)點(diǎn):服務(wù)端能識(shí)別不同的客戶端代理,能為相同的客戶端分配同一個(gè)實(shí)例,這個(gè)實(shí)例對(duì)象會(huì)一直保持,直到會(huì)話的結(jié)束。

      缺點(diǎn):整個(gè)會(huì)話期間,占用服務(wù)器資源,因此無法支持過多的客戶端,因?yàn)閯?chuàng)建服務(wù)實(shí)例代價(jià)比較大;與客戶端、服務(wù)器模式一樣存在可伸縮性的問題。

      維持服務(wù)端與客戶端的會(huì)話,WCF依靠傳輸層會(huì)話或者通過ws*綁定來模擬傳輸層會(huì)話。

       

       

          Single:

      優(yōu)點(diǎn):無需考慮線程的同步問題,客戶端對(duì)服務(wù)的調(diào)用是排隊(duì)進(jìn)行的,服務(wù)一次只能為一個(gè)客戶端進(jìn)行處理,處理完成后才能進(jìn)行為下一個(gè)客戶端服務(wù)。

      缺點(diǎn):由于是串行的方式為客戶端服務(wù),所以效率比較低。服務(wù)的可伸縮性限制比較大

       

      3、設(shè)計(jì)服務(wù) 

      3.1、PerCall模式

      設(shè)計(jì)單調(diào)服務(wù)(PerCall模式時(shí)):雖然可以應(yīng)用在任一服務(wù)上,但是在設(shè)計(jì)此類服務(wù)時(shí)還是應(yīng)該注意到一些問題:由于客戶端不用關(guān)心服務(wù)端實(shí)例模型,PerCall模式下,服務(wù)也是每次都為客戶端端的調(diào)用分配新的實(shí)例對(duì)象,調(diào)用完成后就銷毀實(shí)例,因此客戶端需要進(jìn)行一些狀態(tài)管理。 為此,客戶端在進(jìn)行服務(wù)調(diào)用時(shí),服務(wù)端實(shí)例對(duì)象實(shí)例化時(shí)需要從存儲(chǔ)介質(zhì)中獲取狀態(tài),那么每個(gè)操作對(duì)都應(yīng)該有只是一個(gè)參數(shù),在進(jìn)行服務(wù)調(diào)用時(shí),通過參數(shù)來初始化狀態(tài)。

      示例:

       

           [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

          publicclass OrderService : IOrder,IDisposable

          {
              private int _counter;

              public OrderService()
              {
                  _counter = 0;
                  Console.WriteLine("perCall Mode");
                  Console.WriteLine("counter is {0}", _counter);
              }

              #region IOrder Members

              public void Order(string orderId)
              {                       
                  int amount = GetStore(orderId);
                  UpdateStore(amount - order.Number);
              }

              #endregion

              private int GetStore(string orderId)
              {
                  string connectionString = ConfigurationManager.AppSettings["connectionString"];
                  using (var connection = new SqlConnection(connectionString))
                  {
                      connection.Open();
                       //獲取庫(kù)存數(shù)量信息
                      return int;
                  }
              }

              private void UpdateStore(int p)
              {
                  string connectionString = ConfigurationManager.AppSettings["connectionString"];
                  using (var connection = new SqlConnection(connectionString))
                  {
                      connection.Open();
                      // 將庫(kù)存信息更新到數(shù)據(jù)庫(kù)                
                  }
              }


              public void Dispose()
              {
                  //釋放資源
              }
          }

       

        3.2、PerSession模式

      使用PreSession模式時(shí),即使WCF在一個(gè)服務(wù)實(shí)現(xiàn)中,將服務(wù)實(shí)現(xiàn)的多個(gè)契約定義為會(huì)話或者非會(huì)話模式,但最好使用一致性配置,即所有契約都支持會(huì)話,避免將不同模式的服務(wù)定義在一個(gè)服務(wù)實(shí)現(xiàn)中。 

      3.3、Single模式 

      Single模式的服務(wù)于可伸縮性有著劇烈的沖突。Single模式的服務(wù)所有的客戶端代理均使用同一個(gè)服務(wù)實(shí)例,WCF服務(wù)保證了服務(wù)狀態(tài)的同步性。存在并發(fā)性訪問比較高的情況下,它帶來的是性能的嚴(yán)重下降。 只有在應(yīng)用場(chǎng)景中適用單例的時(shí)候使用它。通常,應(yīng)盡可能的使用其他方案來使?fàn)顟B(tài)同步,盡量避免使用Single模式.

      后記:讀《WCF 服務(wù)編程》后的對(duì)實(shí)例模式的重新認(rèn)識(shí)。 

      posted @ 2012-10-12 13:55  tyb1222  閱讀(6717)  評(píng)論(12)    收藏  舉報(bào)
      主站蜘蛛池模板: 中牟县| 无码精品人妻一区二区三区中| 亚洲AV无码破坏版在线观看| 大足县| 九九热精品免费在线视频| 中文字幕精品人妻丝袜| 人妻中文字幕亚洲精品| 国产精品久久久一区二区三区| 亚洲国产成人无码影院| 美日韩精品一区二区三区| 2020国产成人精品视频| 精品亚洲欧美高清不卡高清| 中文字幕日韩精品国产| 国自产拍偷拍精品啪啪一区二区| 7878成人国产在线观看| 性色a∨精品高清在线观看| 日本熟妇浓毛| 中文字幕在线国产精品| 民勤县| 亚洲一区二区三区色视频| 99在线精品国自产拍中文字幕 | 亚洲精品久综合蜜| 她也色tayese在线视频| 日韩精品亚洲专在线电影| 亚洲国产在一区二区三区| 国产高清精品在线91| 国产成人MV视频在线观看| 国产高清av首播原创麻豆| 亚洲男人天堂2018| 性色在线视频精品| 国产熟睡乱子伦视频在线播放| 国偷自产av一区二区三区| 亚洲高清国产成人精品久久| 亚洲人成电影在线天堂色| 欧美性xxxxx极品少妇| 午夜福利宅福利国产精品| 铅山县| 中文字幕在线精品国产| 三级4级全黄60分钟| 91香蕉国产亚洲一二三区| 亚洲无码精品视频|