乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      WCF開發(fā)日志 -- WCF啟動多個服務(wù)

       昵稱10504424 2013-01-31

      場景:  

            項目比較大,不可能所有契約在一個類里來實現(xiàn),可能會有上百個服務(wù)上千個契約,按照目前在網(wǎng)上搜索的結(jié)果是…..只能一個servicehost對應(yīng)一個服務(wù),某個mvp的建議是所有契約都放到一個類里來實現(xiàn)。。。我崩潰  。。。。。

      想法:

             也有人建議用 partial class的方式,把不同的契約分布到不同的CS文件里,雖然可能看上去好一點,但每回添加服務(wù)都得重編譯,我覺得太扯淡了 。。。。。

             我希望是盡可能的把服務(wù)根據(jù)功能的不同按模塊劃分開來,不同的服務(wù)做成不同的dll,以插件的形式注冊到一個表里,用servicehost來加載,不知大家有沒有好的建議 。

             其實可以考慮用CSLA.NET的方案,只寫一個服務(wù),它稱為統(tǒng)一入口,這個方式還是不錯的,就是他為解決并發(fā),并發(fā)好像在博客園里有人寫了怎么實現(xiàn),地址是                  http://www.cnblogs.com/zgynhqf/archive/2010/07/01/1769228.html

      現(xiàn)實: 

      說一千道一萬架不住我不會,我只能實現(xiàn):

      1、如何在Windows中Host多個WCF服務(wù)? 
      2、不能是多個Open方法,那樣太幼稚了 !

      3、 考慮到整個團隊都不會CSLA.NET,或OEA 就我會一點:) , 這個還的多謝周哥,和 胡總 的栽培了。

      4、 整個團隊學(xué)習(xí)成本太高,只有不斷的分享,討論來加快進度了。 

       

      二、本文大綱

             a、摘要 。

             b、本文大綱 。

             c、項目準(zhǔn)備階段 。

             d、主要核心代碼 。

             e、達(dá)到的效果圖 。

      三、項目準(zhǔn)備階段

      這個圖需要一點C# 基礎(chǔ)才能看的懂的:) 估計一上圖大家就看的懂(自己想象中……..)了。

      clipboard

         這里主要是創(chuàng)建 Windows項目和 WCF Service Library 項目

        Windows項目還需要引用WCF Service Library 項目

       

      四、主要核心代碼

      clipboard[9]

      運行按鈕事件代碼:

       1:         private void button1_Click(object sender, EventArgs e)
       2:         {
       3:             if (button1.Tag == "run")
       4:             {
       5:                 ServiceStart();
       6:                 button1.Text = "停止(&X)";
       7:                 button1.Tag = "stop";
       8:             }
       9:             else
      10:             {
      11:                 button1.Text = "運行(&R)";
      12:                 button1.Tag = "run";
      13:             }
      14:         }
      15:   

      ServiceStart() 函數(shù)代碼:

       1:  private List<ServiceHost> serviceHosts = new List<ServiceHost>();
       2:    private void ServiceStart()
       3:    {
       4:   
       5:        #region 初?始?化ˉ serviceHosts
       6:        if (serviceHosts != null)
       7:        {
       8:            foreach (ServiceHost t in serviceHosts)
       9:            {
      10:                if (t != null)
      11:                    t.Close();
      12:            }
      13:        }
      14:        else
      15:        {
      16:            serviceHosts = new List<ServiceHost>();
      17:        }
      18:        #endregion
      19:  
      20:        string serviceAddress = string.Format("net.tcp://{0}:{1}", "127.0.0.1", "8000");
      21:   
      22:        Dictionary<Type,Type> sevtypes=new Dictionary<Type,Type>();
      23:        sevtypes.Add(typeof(IService1),typeof(Service1));
      24:        sevtypes.Add(typeof(IService2), typeof(Service2));
      25:   
      26:        string endpointAddress = string.Empty;
      27:        string tName = string.Empty;
      28:        StringBuilder msgService = new StringBuilder();
      29:        foreach (var item in sevtypes)
      30:        {
      31:            tName = item.Key.Name.Substring(1);
      32:            endpointAddress = serviceAddress + tName;
      33:            if (!serviceAddress.EndsWith("/"))
      34:                endpointAddress = string.Format("{0}/{1}", serviceAddress, tName);
      35:            ServiceHost serviceHost = new ServiceHost(item.Value, new Uri(endpointAddress));
      36:   
      37:            //加載元數(shù)據(jù)結(jié)點
      38:            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
      39:            serviceHost.Description.Behaviors.Add(smb);
      40:            serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
      41:            //加載NetTcpBinding結(jié)點
      42:            NetTcpBinding netTcpBinding = new NetTcpBinding();
      43:            netTcpBinding.Security.Mode = SecurityMode.None;
      44:            netTcpBinding.ReceiveTimeout = TimeSpan.Parse("00:10:00");
      45:            netTcpBinding.MaxBufferPoolSize = 2147483647;
      46:            netTcpBinding.MaxBufferSize = 2147483647;
      47:            netTcpBinding.MaxConnections = 10;
      48:   
      49:            netTcpBinding.ReaderQuotas.MaxDepth = 2147483647;
      50:            netTcpBinding.ReaderQuotas.MaxStringContentLength = 2147483647;
      51:            netTcpBinding.ReaderQuotas.MaxArrayLength = 2147483647;
      52:            netTcpBinding.ReaderQuotas.MaxBytesPerRead = 2147483647;
      53:            netTcpBinding.ReaderQuotas.MaxNameTableCharCount = 2147483647;
      54:            netTcpBinding.MaxReceivedMessageSize = 2147483647;
      55:            serviceHost.AddServiceEndpoint(item.Key, netTcpBinding, endpointAddress);
      56:   
      57:            serviceHost.Opened += delegate
      58:            {
      59:                msgService.AppendLine(string.Format("{0}開始監(jiān)聽 Uri 為 :{1}/mex", tName, endpointAddress.ToString()));
      60:            };
      61:   
      62:            serviceHost.Open();
      63:            serviceHosts.Add(serviceHost);
      64:        }
      65:        this.textBox1.Text = msgService.ToString();
      66:    }
      67:   

      代碼約定:

          每次增加服務(wù)和契約的時候都需要同時添加 Dictionary 要不然系統(tǒng)不會啟動新增加的服務(wù)。

      服務(wù)地址:

      net.tcp://127.0.0.1:8000/服務(wù)名/mex

      image

      上面的例子生成如下地址:

      net.tcp://127.0.0.1:8000/Service1/mex

      net.tcp://127.0.0.1:8000/Service2/mex

      把 ”Dictionary ”改成配置文件形式,也就通用了。

       

      網(wǎng)上的一個使用配置文件的例子:

      配置文件如下:

       1:   <system.serviceModel>
       2:      <services>
       3:        <service name="ChinaQueue.Restaurant.WCFService.ServiceImplementations.PrinterSer" behaviorConfiguration="sb">
       4:          <host>
       5:            <baseAddresses>
       6:              <add baseAddress="net.tcp://localhost:8081" />
       7:            </baseAddresses>
       8:          </host>
       9:          <endpoint name="NetTcpBinding_IPrinterServer" address="PrinterSer" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IServer" contract="ChinaQueue.Restaurant.WCFService.ServiceContracts.IPrinterSer" />
      10:          <endpoint name="MexTcpBinding_IPrinterServer" address="Printer" binding="mexTcpBinding" contract="IMetadataExchange" />
      11:        </service>
      12:        <service name="ChinaQueue.Restaurant.WCFService.ServiceImplementations.CounterSer" behaviorConfiguration="sb">
      13:          <host>
      14:            <baseAddresses>
      15:              <add baseAddress="net.tcp://localhost:8081" />
      16:            </baseAddresses>
      17:          </host>
      18:          <endpoint name="NetTcpBinding_ICounterServer" address="CounterSer" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IServer" contract="ChinaQueue.Restaurant.WCFService.ServiceContracts.ICounterSer" />
      19:          <endpoint name="MexTcpBinding_ICounterServer" address="Counter" binding="mexTcpBinding" contract="IMetadataExchange" />
      20:        </service>
      21:        <service name="ChinaQueue.Restaurant.WCFService.ServiceImplementations.QuerySer" behaviorConfiguration="sb">
      22:          <host>
      23:            <baseAddresses>
      24:              <add baseAddress="net.tcp://localhost:8081" />
      25:            </baseAddresses>
      26:          </host>
      27:          <endpoint name="NetTcpBinding_IQueryServer" address="QuerySer" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IServer" contract="ChinaQueue.Restaurant.WCFService.ServiceContracts.IQuerySer" />
      28:          <endpoint name="MexTcpBinding_IQueryServer" address="Query" binding="mexTcpBinding" contract="IMetadataExchange" />
      29:        </service>
      30:      </services>
      31:      <behaviors>
      32:        <serviceBehaviors>
      33:          <behavior name="sb">
      34:            <serviceMetadata />
      35:            <serviceDebug includeExceptionDetailInFaults="true" />
      36:          </behavior>
      37:        </serviceBehaviors>
      38:      </behaviors>
      39:      <bindings>
      40:        <netTcpBinding>
      41:          <binding name="NetTcpBinding_IServer">
      42:            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      43:            <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      44:            <security mode="None">
      45:              <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
      46:              <message clientCredentialType="Windows" />
      47:            </security>
      48:          </binding>
      49:        </netTcpBinding>
      50:      </bindings>
      51:      <client>
      52:        <endpoint address="net.tcp://localhost:8081/PrinterSer" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IServer" contract="ChinaQueue.Restaurant.WCFService.ServiceContracts.IPrinterSer" name="NetTcpBinding_IPrinterServer" />
      53:        <endpoint address="net.tcp://localhost:8081/CounterSer" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IServer" contract="ChinaQueue.Restaurant.WCFService.ServiceContracts.ICounterSer" name="NetTcpBinding_ICounterServer" />
      54:        <endpoint address="net.tcp://localhost:8081/QuerySer" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IServer" contract="ChinaQueue.Restaurant.WCFService.ServiceContracts.IQuerySer" name="NetTcpBinding_IQueryServer" />
      55:      </client>
      56:    </system.serviceModel>
      57:  

      以上是三個服務(wù)的配置, 
      然后在Main方法中Host這三個服務(wù),以下是如何從配置文件中讀取服務(wù)并進行Host的

      System.ServiceModel.Configuration

       1:  Configuration conf = ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);
       2:             ServiceModelSectionGroup svcmod = (ServiceModelSectionGroup)conf.GetSectionGroup("system.serviceModel");
       3:             foreach (ServiceElement el in svcmod.Services.Services)
       4:             {
       5:                 Type svcType = Type.GetType(el.Name + "," + "ChinaQueue.Restaurant.WCFService");
       6:                 if (svcType == null)
       7:                     throw new Exception("Invalid Service Type " + el.Name + " in configuration file.");
       8:                 ServiceHost aServiceHost = new ServiceHost(svcType);
       9:                 aServiceHost.Open();
      10:             }
      11:   

       

       

      五、達(dá)到的效果圖

       

      測試通過,有圖作證:

      clipboard[11]

      這個服務(wù)啟動成功了,客服端也測試通過,耶搞定。  

       

       

       

       

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多