一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

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

 

    上一節(jié)《WCF分布式框架基礎(chǔ)概念》我們介紹了WCF服務(wù)的概念和通信框架模型,并給出了基于自定義托管服務(wù)的WCF程序的實(shí)現(xiàn)代碼。考慮到WCF分布式開發(fā)項(xiàng)目中關(guān)于托管宿主服務(wù)配置和客戶端添加引用。兩個(gè)環(huán)節(jié)最容易出錯(cuò)。對(duì)于大部分想學(xué)習(xí)WCF分布式開發(fā)的人來(lái)說,成功開發(fā)、配置、部署第一個(gè)自己的WCF服務(wù)困難重重。很多資料都介紹了WCF的基本概念。但是對(duì)于實(shí)際的項(xiàng)目開發(fā)過程介紹粗略,給入門者帶來(lái)諸多不便。今天我們就來(lái)補(bǔ)充一節(jié)WCF分布式開發(fā)一個(gè)完整解決方案的開發(fā)和配置過程。本節(jié)基本結(jié)構(gòu)是:首先介紹【1】WCF服務(wù)解決方案的項(xiàng)目組成【2】WCF服務(wù)的開發(fā)和配置過程,【3】自定義宿主的開發(fā)和配置過程【4】客戶端的服務(wù)引用和配置過程。【總結(jié)】算是為各位WCF分布式技術(shù)開發(fā)的愛好者,提供的一個(gè)開發(fā)參考。

【1】WCF服務(wù)解決方案的項(xiàng)目組成:

1.1】WCF服務(wù):

    通常來(lái)說,WCF服務(wù)由三個(gè)部分構(gòu)成:

  • 服務(wù)類:包含服務(wù)契約、操作契約和數(shù)據(jù)契約的定義和實(shí)現(xiàn);

  • 宿主:一種應(yīng)用程序域和進(jìn)程,服務(wù)將在該環(huán)境中運(yùn)行;

  • 終結(jié)點(diǎn):由客戶端用于訪問服務(wù)。

我們這里的解決方案包括服務(wù)類項(xiàng)目、托管宿主、和簡(jiǎn)單的客戶端程序,結(jié)構(gòu)如圖:

1.2】客戶端應(yīng)用程序:

     上一節(jié)我們介紹了WCF的基本概念,WCF基本通信機(jī)制是基于SOAP消息,SOAP消息基于XML語(yǔ)言,因此WCF應(yīng)用程序可與運(yùn)行于各種上下文環(huán)境的其他進(jìn)程進(jìn)行通信,當(dāng)然也支持跨系統(tǒng)、跨平臺(tái)的應(yīng)用程序之間的數(shù)據(jù)交互。基于WCF構(gòu)建的分布式應(yīng)用程序可與下列所有程序進(jìn)行交互:

  • 同一 Windows 計(jì)算機(jī)上不同進(jìn)程中的WCF應(yīng)用程序。

  • 另一 Windows 計(jì)算機(jī)上的WCF應(yīng)用程序。

  • 基于其他技術(shù)構(gòu)建的應(yīng)用程序,如基于 Java 2 企業(yè)版 (J2EE) 構(gòu)建的、支持標(biāo)準(zhǔn) Web 服務(wù)的應(yīng)用程序服務(wù)器。這些應(yīng)用程序可以運(yùn)行在 Windows 計(jì)算機(jī)上,也可以運(yùn)行在其他操作系統(tǒng)(如 Sun Solaris、IBM 的 z/OS 或 Linux)上。

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

【2】WCF服務(wù)類的開發(fā)過程:

    要?jiǎng)?chuàng)建WCF服務(wù)解決方案,首先應(yīng)該定義服務(wù)類,并編寫服務(wù)類的相關(guān)的代碼。我們這里把服務(wù)類創(chuàng)建類單獨(dú)的類庫(kù)項(xiàng)目,托管宿主程序項(xiàng)目引用服務(wù)類的程序集。

2.0】創(chuàng)建WCF服務(wù)類庫(kù)項(xiàng)目:

    WCF服務(wù)類庫(kù)項(xiàng)目的創(chuàng)建非常簡(jiǎn)單,Visual Studio 2008為我們提供了便捷的方式,選擇新建項(xiàng)目,選擇--WCF服務(wù)類庫(kù)項(xiàng)目項(xiàng)目,輸入項(xiàng)目名稱,選擇保存位置就可以。如圖:

     當(dāng)然我們也可以建立空項(xiàng)目,但是程序集引用等操作要手動(dòng)完整,過程相對(duì)復(fù)雜。這里我們選擇的使用創(chuàng)建向?qū)Х绞健?/p>

System.ServiceModel和System.Runtime.Serialization程序集對(duì)WCF服務(wù)至關(guān)重要,因?yàn)楹罄m(xù)服務(wù)契約、操作契約和數(shù)據(jù)契約等特性定義都在這兩個(gè)程序集中。我們?cè)谛陆ǖ捻?xiàng)目引用中可以看到:

    使用WCF契約相關(guān)的屬性,必須顯示引用這兩個(gè)命名空間.語(yǔ)句如下:

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

   如果不添加命名空間引用程序集,編寫的代碼會(huì)出現(xiàn)錯(cuò)誤,無(wú)法通過。

2.1】服務(wù)契約和操作契約:

    WCF服務(wù)類庫(kù)創(chuàng)建完畢后,我們可以來(lái)進(jìn)行代碼的實(shí)際編寫。我們知道,每個(gè)WCF服務(wù)類均需實(shí)現(xiàn)一些方法,以供其客戶端使用。服務(wù)類的創(chuàng)建者通過將這些方法包含在某個(gè)服務(wù)契約中,來(lái)決定將哪些方法公開為客戶可調(diào)用的操作。服務(wù)契約就是顯示指定的服務(wù)必須實(shí)現(xiàn)的用戶可以使用的操作。

   ServiceContract 屬性以及 WCF使用的所有其他屬性均在 System.ServiceModel 命名空間中定義,類聲明使用 using 語(yǔ)句來(lái)引用該命名空間。服務(wù)類中可被客戶端調(diào)用的每個(gè)方法都必須使用名為 OperationContract 的另一個(gè)屬性加以標(biāo)記。服務(wù)類中帶有前置 OperationContract 屬性的所有方法都將自動(dòng)被WCF公開為 SOAP 可調(diào)用操作。

    WCF中最基本的屬性是 ServiceContract。實(shí)際上,WCF服務(wù)類本身就是標(biāo)記有 ServiceContract 屬性的類或者是實(shí)現(xiàn)了標(biāo)記有該屬性的接口的類。我們使用的還是上次的代碼:

    首先是服務(wù)契約IWCFService,定義了連個(gè)操作,添加[OperationContract]屬性標(biāo)記

 //1.服務(wù)契約
    [ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
    
public interface IWCFService
    {
        
//操作契約
        [OperationContract]
        
string SayHello(string name);
        
//操作契約
        [OperationContract]
        
string SayHelloToUser(User user);

    }
【3】自定義宿主的開發(fā)和配置過程:

    我們這里使用的控制臺(tái)程序?yàn)橥泄芩拗鳎覀冞@里講解托管宿主的代碼編寫和配置文件的設(shè)置過程。

3.1】托管宿主程序的創(chuàng)建:

   使用VS2008新建控制臺(tái)應(yīng)用程序,非常簡(jiǎn)單,選擇新建項(xiàng)目-控制臺(tái)程序,即可。

3.2】托管宿主代碼編寫:

   這里要添加對(duì)WCF服務(wù)類庫(kù)項(xiàng)目的引用,另外要引用ServiceModel程序集。ServiceHost類位于ServiceModel命名空間下。這里比較重要的步驟就是,定義一個(gè)ServiceHost實(shí)例,定義地址,定義終結(jié)點(diǎn)使用ABC地址、契約、綁定。

代碼如下:

 //反射方式創(chuàng)建服務(wù)實(shí)例,
            
//Using方式生命實(shí)例,可以在對(duì)象生命周期結(jié)束時(shí)候,釋放非托管資源
            using (ServiceHost host = new ServiceHost(typeof(WCFService.WCFService)))
            {
                
//相同的服務(wù)注冊(cè)多個(gè)基地址
                
//添加服務(wù)和URI,用戶資源標(biāo)識(shí)符
                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();
                
//顯示運(yùn)行狀態(tài)
                Console.WriteLine("Host is runing! and state is {0}",host.State);
                
//等待輸入即停止服務(wù)
                Console.Read();
            
            
            }
【4】客戶端的服務(wù)引用、配置和開發(fā)過程:

    服務(wù)類和服務(wù)宿主已經(jīng)配置完畢,下面我們來(lái)講述客戶端添加WCF服務(wù)的引用、配置和服務(wù)調(diào)用過程。

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

4.1】添加WCF服務(wù)引用:

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

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

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

證明我們添加WCF服務(wù)成功。客戶端app.config文件里會(huì)生成相應(yīng)的服務(wù)代理的相關(guān)信息,包括客戶端終結(jié)點(diǎn)的信息:

<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>

NET技術(shù)WCF分布式開發(fā)步步為贏(2)自定義托管宿主WCF解決方案開發(fā)配置過程詳解,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日本二三区 | 99精品伊人久久久大香线蕉 | 无遮挡一级毛片视频 | 久久久久久久综合狠狠综合 | 精品久久久久久久久免费影院 | se97se成人亚洲网站在线观看 | 美国一区二区三区 | 永久免费精品影视网站 | 激性欧美激情在线播放16页 | 色多多视频在线播放 | 精品一区二区三区四区五区 | 伊人精品国产 | 亚洲一区二区三区高清 | 日本视频一区二区免费播放 | 久久久毛片 | 国产剧情乱偷 | 亚洲青草视频 | 亚洲一区二区三区高清视频 | 午夜免费视频观看 | 国产91综合 | 狠狠干2023| 亚洲成在人色婷婷 | 成人婷婷| 天天做天天爽爽快快 | 尤物yw午夜国产精品视频 | 色多多成视频人在线观看 | 成人精品第一区二区三区 | 在线观看网站黄 | 精品国产一区二区三区2021 | 亚洲第一在线 | 国产精品日本不卡一区二区 | 国产乱人伦精品一区二区 | 一二三四视频社区在线中文 | 国产91精品一区二区麻豆亚洲 | 成年人免费小视频 | 国内精品自在自线2020 | 精品久久久久久久久久久久久久久 | 91精品免费观看老司机 | 一道本加勒比 | 国产精品福利在线播放 | 99亚洲精品|