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

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

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

      WCF分布式開發步步為贏(2)自定義托管宿主WCF解決方案開發配置過程詳解

      上一節《WCF分布式框架基礎概念》我們介紹了WCF服務的概念和通信框架模型,并給出了基于自定義托管服務的WCF程序的實現代碼??紤]到WCF分布式開發項目中關于托管宿主服務配置和客戶端添加引用。兩個環節最容易出錯。對于大部分想學習WCF分布式開發的人來說,成功開發、配置、部署第一個自己的WCF服務困難重重。很多資料都介紹了WCF的基本概念。但是對于實際的項目開發過程介紹粗略,給入門者帶來諸多不便。今天我們就來補充一節WCF分布式開發一個完整解決方案的開發和配置過程。本節基本結構是:首先介紹【1】WCF服務解決方案的項目組成【2】WCF服務的開發和配置過程,【3】自定義宿主的開發和配置過程【4】客戶端的服務引用和配置過程?!究偨Y】算是為各位WCF分布式技術開發的愛好者,提供的一個開發參考。

      【1】WCF服務解決方案的項目組成:

      1.1】WCF服務:

          通常來說,WCF服務由三個部分構成:

      • 服務類:包含服務契約、操作契約和數據契約的定義和實現;

      • 宿主:一種應用程序域和進程,服務將在該環境中運行;

      • 終結點:由客戶端用于訪問服務。

      我們這里的解決方案包括服務類項目、托管宿主、和簡單的客戶端程序,結構如圖:

      1.2】客戶端應用程序:

           上一節我們介紹了WCF的基本概念,WCF基本通信機制是基于SOAP消息,SOAP消息基于XML語言,因此WCF應用程序可與運行于各種上下文環境的其他進程進行通信,當然也支持跨系統、跨平臺的應用程序之間的數據交互?;赪CF構建的分布式應用程序可與下列所有程序進行交互:

      • 同一 Windows 計算機上不同進程中的WCF應用程序。

      • 另一 Windows 計算機上的WCF應用程序。

      • 基于其他技術構建的應用程序,如基于 Java 2 企業版 (J2EE) 構建的、支持標準 Web 服務的應用程序服務器。這些應用程序可以運行在 Windows 計算機上,也可以運行在其他操作系統(如 Sun Solaris、IBM 的 z/OS 或 Linux)上。

          因此可以作為客戶端的應用程序,并不限制其類型,只要可以解析基于XML的SOAP消息,都可以與WCF的服務端進行通信。.NET平臺上我們可以創建控制臺應用程序、WinForm、Windows服務、ASP.NET應用程序等,來訪問和調用WCF服務。下面我們就來具體介紹自定義托管服務,WCF解決方案的開發配置的詳細過程。

      【2】WCF服務類的開發過程:

          要創建WCF服務解決方案,首先應該定義服務類,并編寫服務類的相關的代碼。我們這里把服務類創建類單獨的類庫項目,托管宿主程序項目引用服務類的程序集。

      2.0】創建WCF服務類庫項目:

          WCF服務類庫項目的創建非常簡單,Visual Studio 2008為我們提供了便捷的方式,選擇新建項目,選擇--WCF服務類庫項目項目,輸入項目名稱,選擇保存位置就可以。如圖:

           當然我們也可以建立空項目,但是程序集引用等操作要手動完整,過程相對復雜。這里我們選擇的使用創建向導方式。

      System.ServiceModel和System.Runtime.Serialization程序集對WCF服務至關重要,因為后續服務契約、操作契約和數據契約等特性定義都在這兩個程序集中。我們在新建的項目引用中可以看到:

          使用WCF契約相關的屬性,必須顯示引用這兩個命名空間.語句如下:

      using System.ServiceModel;
      using System.Runtime.Serialization;

         如果不添加命名空間引用程序集,編寫的代碼會出現錯誤,無法通過。

      2.1】服務契約和操作契約:

          WCF服務類庫創建完畢后,我們可以來進行代碼的實際編寫。我們知道,每個WCF服務類均需實現一些方法,以供其客戶端使用。服務類的創建者通過將這些方法包含在某個服務契約中,來決定將哪些方法公開為客戶可調用的操作。服務契約就是顯示指定的服務必須實現的用戶可以使用的操作。

         ServiceContract 屬性以及 WCF使用的所有其他屬性均在 System.ServiceModel 命名空間中定義,類聲明使用 using 語句來引用該命名空間。服務類中可被客戶端調用的每個方法都必須使用名為 OperationContract 的另一個屬性加以標記。服務類中帶有前置 OperationContract 屬性的所有方法都將自動被WCF公開為 SOAP 可調用操作。

          WCF中最基本的屬性是 ServiceContract。實際上,WCF服務類本身就是標記有 ServiceContract 屬性的類或者是實現了標記有該屬性的接口的類。我們使用的還是上次的代碼:

          首先是服務契約IWCFService,定義了連個操作,添加[OperationContract]屬性標記:

      復制代碼
       //1.服務契約
          [ServiceContract(Namespace = "http://www.rzrgm.cn/frank_xl/")]
          public interface IWCFService
          {
              //操作契約
              [OperationContract]
              string SayHello(string name);
              //操作契約
              [OperationContract]
              string SayHelloToUser(User user);

          }
      復制代碼

          其次定義WCF服務類,繼承服務契約,實現服務契約中聲明的操作,具體代碼如下:

      復制代碼
       //2.服務類,繼承接口。實現服務契約定義的操作
          public class WCFService : IWCFService
          {
              //實現接口定義的方法
              public string SayHello(string name)
              {
                  Console.WriteLine("Hello! {0},Using string ", name);
                  return "Hello! " + name;
              }
              //實現接口定義的方法
              public string SayHelloToUser(User user)
              {
                  Console.WriteLine("Hello! {0}    {1},Using DataContract ", user.FirstName, user.LastName);
                  return "Hello! " + user.FirstName + " " + user.LastName;
              }
          }
      復制代碼

          服務類里給出了服務契約里聲明的方法,也就是操作,這里都給出了具體的實現。SayHello()和SayHelloToUser(User user)方法都將自動被WCF公開為 SOAP 可調用操作??蛻舳丝梢哉{用相應的操作。

      2.2】數據契約:

          數據契約定義類型如何轉換為適合標準信息格式,即“序列化”過程。實際上,數據契約是控制數據如何序列化的一種機制。 在 WCF 服務類中,數據契約使用 DataContract 屬性來定義。標記有 DataContract 的數據類、結構或其他類型都可以擁有一個或多個帶有前置 DataMember 屬性的成員,指示該成員必須被包含在此類型的序列化值中。不顯示指定的成員不被包含在序列化數據中。這里我們定義的數據類,包含三個成員,代碼如下:

      復制代碼
          //3.數據契約//序列化為XML,作為元數據封裝到服務里
          [DataContract]
          public struct User
          {
              [DataMember]
              public string FirstName;

              public string MiddleName;//不會被傳遞
              [DataMember]
              public string LastName;
          }
      復制代碼

           由于是類庫項目,所以主要涉及的內容是契約的定義和服務類的實現過程。配置的關鍵部分也是契約屬性的標記。

      不涉及配置文件的使用和定制,如果是應用程序,需要配置對應的Config文件。

      【3】自定義宿主的開發和配置過程:

          我們這里使用的控制臺程序為托管宿主,我們這里講解托管宿主的代碼編寫和配置文件的設置過程。

      3.1】托管宿主程序的創建:

         使用VS2008新建控制臺應用程序,非常簡單,選擇新建項目-控制臺程序,即可。

      3.2】托管宿主代碼編寫:

         這里要添加對WCF服務類庫項目的引用,另外要引用ServiceModel程序集。ServiceHost類位于ServiceModel命名空間下。這里比較重要的步驟就是,定義一個ServiceHost實例,定義地址,定義終結點使用ABC地址、契約、綁定。

      代碼如下:

      復制代碼
       //反射方式創建服務實例,
                  //Using方式生命實例,可以在對象生命周期結束時候,釋放非托管資源
                  using (ServiceHost host = new ServiceHost(typeof(WCFService.WCFService)))
                  {
                      //相同的服務注冊多個基地址
                      //添加服務和URI,用戶資源標識符
                      Uri tcpAddress = new Uri("net.tcp://localhost:8001/WCFService");
                      Uri httpAddress = new Uri("http://localhost:8002/WCFService");
                      Uri pipeAddress = new Uri("net.pipe://localhost:8002/WCFService");
                      host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NetTcpBinding() , tcpAddress);
                      host.AddServiceEndpoint(typeof(WCFService.IWCFService), new WSHttpBinding(), httpAddress);
                      host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NetNamedPipeBinding(), pipeAddress);
                      //判斷是否以及打開連接,如果尚未打開,就打開偵聽端口
                      if (host.State !=CommunicationState.Opening)
                      host.Open();
                      //顯示運行狀態
                      Console.WriteLine("Host is runing! and state is {0}",host.State);
                      //等待輸入即停止服務
                      Console.Read();
                  
                  
                  }
      復制代碼

             值得注意的是定義終結點的代碼可以由配置文件的定制來實現。 if (host.State !=CommunicationState.Opening)語句是為了判斷是否以及打開連接,如果尚未打開,host.Open(); 就打開偵聽端口。
             Console.Read()語句是阻塞進程,使得宿主程序可以一直運行下去。直到用戶輸入數據。          

      3.3】配置文件的定制:

          要使WCF宿主程序能夠正確運行,還需要編輯配置文件信息。所有的WCF服務相關的配置信息都處于app.config文件的  <system.serviceModel>節點內。下面我們就來詳細介紹一下詳細的配置過程。

          3.3.1【服務結點配置】

            <service behaviorConfiguration="WCFService.WCFServiceBehavior" name="WCFService.WCFService">

          指定公布服務的類型和行為。服務的行為要在配置文件中給出,我們下面會給出詳細的說明。這里的WCF服務就是我們實現服務契約的WCF服務的類名WCFService。

          服務的終結點包含ABC,地址、綁定(通信協議,其實很拗口)、契約三個部分。地址包括:通信協議、機器地址、端口、服務名。契約就是服務契約。我們這里配置了連個終結點,分別使用HTTP協議和TCP協議。端口分別是8001和8002。服務地址必須不同,所以設置了兩個不同的端口。具體的配置代碼如下:

      復制代碼
      <endpoint 
                address="http://localhost:8001/WCFService" 
                binding="wsHttpBinding" 
                contract="WCFService.IWCFService">
              </endpoint>
      <endpoint adress="net.tcp://localhost:8002/WCFService" 
                binding="netTcpBinding" 
                contract="WCFService.IWCFService">
      </endpoint>
      復制代碼

         如果終結點里不設置地址,我們必須配置文件里給出相應的基地址配置,基地址包括:通信協議(綁定)、機器名或IP、端口。這樣WCF服務的托管宿主啟動后,狀態才能成功打開。配置信息如下:

      <host>
                <baseAddresses>
                  <add baseAddress="http://localhost:8001/"/>
                  <add baseAddress="net.tcp://localhost:8002/"/>
                </baseAddresses>
      </host>

       

          3.3.2【原數據終結點配置】

          如果我們希望WCF可以被客戶端查找和引用,我們就要設置相應的元素據交換節點,來約束WCF服務的元數據交換行為。綁定(通信協議)和我們上面設置的服務終結點對應,這樣客戶端可以以不同的方式獲得元素據,數據交換契約為IMetadataExchange,具體代碼如下:

              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
              <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />

        這樣客戶端可以通過服務地址獲得我們公布的WCF服務的元素據信息,反序列化創建本地的對應的數據類、服務等類。

          3.3.3【行為結點配置】

          另外我們可以在這里配置服務的行文,在配置文件里的<serviceBehaviors>節點下。定義行為名稱,方便服務引用。是否可以通過httpGet方式獲取服務元素據,是否顯示服務異常的詳細信息,在這里都可以進行設置。

      復制代碼
          <behaviors>
            <serviceBehaviors>
              <behavior name="WCFService.WCFServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
              </behavior>
            </serviceBehaviors>
          </behaviors>
      復制代碼

         這里定義的服務行為就是在上面被服務節點引用的,記住名稱一定要匹配。否則會出現找不到服務行為的異常,程序將無法運行。以上的方式可以通過編程方式實現,但是相對來說配置文件使用簡單,編程方式復雜,需要代碼,但是功能強大,我們可以編程動態控制服務運行的狀態。

         配置完全后就可以編譯,運行托管服務宿主程序。托管宿主啟動正常:

      【4】客戶端的服務引用、配置和開發過程:

          服務類和服務宿主已經配置完畢,下面我們來講述客戶端添加WCF服務的引用、配置和服務調用過程。

      首先要運行宿主程序,這樣才能在客戶端添加服務引用,從元數據獲取服務類的相關信息,生成本地類。

      4.1】添加WCF服務引用:

        服務瀏覽器,單擊客戶端項目,添加Services Reference.在彈出的窗口地址里輸入服務的基地址,首先查找TCP服務。

      保持地址和配置文件里服務的基地址相同,:查找成功后的窗口如下:

        我們可以看到WCF服務類公布的操作,輸入命名空間的名字為ServiceReferenceTcp。同樣的方式添加對HTTP服務的引用。添加成功后我們可以查看所有文件,在客戶端項目的服務引用的窗口看到所有的服務引用的文件信息如圖:

      證明我們添加WCF服務成功??蛻舳薬pp.config文件里會生成相應的服務代理的相關信息,包括客戶端終結點的信息:

      復制代碼
      <client>
                  <endpoint address="http://localhost:8001/WCFService" binding="wsHttpBinding"
                      bindingConfiguration="WSHttpBinding_IWCFService" contract="ServiceReferenceTcp.IWCFService"
                      name="WSHttpBinding_IWCFService">
                      <identity>
                          <userPrincipalName value="FRANK/Administrator" />
                      </identity>
                  </endpoint>
                  <endpoint address="net.tcp://localhost:8002/WCFService" binding="netTcpBinding"
                      bindingConfiguration="NetTcpBinding_IWCFService" contract="ServiceReferenceTcp.IWCFService"
                      name="NetTcpBinding_IWCFService">
                      <identity>
                          <userPrincipalName value="FRANK/Administrator" />
                      </identity>
                  </endpoint>
                  <endpoint address="http://localhost:8001/WCFService" binding="wsHttpBinding"
                      bindingConfiguration="WSHttpBinding_IWCFService1" contract="ServiceReferenceHttp.IWCFService"
                      name="WSHttpBinding_IWCFService1">
                      <identity>
                          <userPrincipalName value="FRANK/Administrator" />
                      </identity>
                  </endpoint>
                  <endpoint address="net.tcp://localhost:8002/WCFService" binding="netTcpBinding"
                      bindingConfiguration="NetTcpBinding_IWCFService1" contract="ServiceReferenceHttp.IWCFService"
                      name="NetTcpBinding_IWCFService1">
                      <identity>
                          <userPrincipalName value="FRANK/Administrator" />
                      </identity>
                  </endpoint>
              </client>
      復制代碼

         客戶端的配置方式和宿主托管方式非常類似,同樣包括地址、綁定、契約等信息。

      4.2】調用服務:

           要調用相應的服務,需要實例化服務代理類的實例,首先添加命名空間的引用using ServiceReferenceHttp;
      using ServiceReferenceTcp;這樣可以使用本地反序列化生成的類和其他配置的信息。我們分別實例化HTTP和TCP代理的類,非別調用服務的不同操作,USER的實例也分別為不同的命名空間中的類型,需要分別指定命名空間。

      具體測試代碼如下:

       

       

      復制代碼
       //HTTP WSHttpBinding_IWCFService1
                  ServiceReferenceHttp.WCFServiceClient wcfServiceProxyHttp = new ServiceReferenceHttp.WCFServiceClient("WSHttpBinding_IWCFService1");
                  //通過代理調用SayHello服務
                  Console.WriteLine(wcfServiceProxyHttp.SayHello("Frank Xu Lei WSHttpBinding"));
                  ////通過代理調用調用SayHelloToUser,傳遞對象
                  ServiceReferenceHttp.User user = new ServiceReferenceHttp.User();
                  user.FirstName = "WSHttpBinding";
                  user.LastName = "Frank";
                  Console.WriteLine(wcfServiceProxyHttp.SayHelloToUser(user));

                  //TCP NetTcpBinding_IWCFService
                  ServiceReferenceTcp.WCFServiceClient wcfServiceProxyTcp = new ServiceReferenceTcp.WCFServiceClient("NetTcpBinding_IWCFService");
                  //通過代理調用SayHello服務
                  Console.WriteLine(wcfServiceProxyTcp.SayHello("Frank Xu Lei NetTcpBinding"));
                  ////通過代理調用調用SayHelloToUser,傳遞對象
                  ServiceReferenceTcp.User userTcp = new ServiceReferenceTcp.User();
                  userTcp.FirstName = "NetTcpBinding";
                  userTcp.LastName = "Frank";
                  Console.WriteLine(wcfServiceProxyTcp.SayHelloToUser(userTcp));
      復制代碼

        運行結果如圖:

         兩者不同的協議服務調用都成功執行,并且返回正確的結果。

      【總結】:

          以上就是本節關于自定義托管宿主WCF服務解決方案開發與配置的詳細過程,包括服務代碼的編寫、宿主程序的開發與配置、客戶端服務的引用和調用。我們這里托管宿主服務使用了配置文件,來配置WCF服務的信息,這里也可以編碼實現。

      另外客戶端要想通過原數據交換來反序列換生成本地的WCF服務類等相關代碼,就需要在托管宿主里配置可以使用的原數據交換節點,這里缺少設置,就會出現獲取服務元數據的異常,導致客戶端添加服務出錯。(最近論文答辯有點忙,所以這個文章更新的比較慢,不好意思)另外給出本文的參考代碼:/Files/frank_xl/WCFServiceConfigFrankXuLei.rar

      希望本篇文章能給大家WCF分布式開發項目的配置帶來一些幫助。~

      posted @ 2016-08-09 11:26  閆寶平  閱讀(1136)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 五月天中文字幕mv在线| 狂躁女人双腿流白色液体| 精品久久久bbbb人妻| 一个色的导航| 老色批国产在线观看精品| 国产一区二区亚洲一区二区三区| 任我爽精品视频在线播放| 牛牛视频一区二区三区| 国产精品一线天在线播放| 虎白女粉嫩尤物福利视频| 国产av仑乱内谢| 午夜激情福利一区二区| 在线视频一区二区三区色| 日本无遮挡吸乳视频| 亚洲综合久久精品国产高清| 亚洲日本韩国欧美云霸高清| 精品尤物国产尤物在线看| 国产精品中文av专线| 欧美成人一卡二卡三卡四卡 | 国产一区二区日韩在线| 久久天天躁狠狠躁夜夜婷| 久热这里只国产精品视频| 日韩成人一区二区三区在线观看| 日韩一区二区三区高清视频| 国产睡熟迷奷系列网站| 泸西县| 国产久久热这里只有精品| 国产中文字幕精品视频| av明星换脸无码精品区| 亚洲国产成人精品av区按摩| 日本在线视频网站www色下载| 久久久久夜夜夜精品国产 | 欧美精品久久天天躁| 国产日韩综合av在线| 五月丁香六月狠狠爱综合| 欧洲亚洲精品免费二区| 草草浮力影院| 国产精品久久久久久福利| 99久久99久久精品免费看蜜桃| 日韩内射美女人妻一区二区三区| 精品国产乱码久久久久久婷婷|