亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WCF簡單教程(1) 入門

發布時間:2020-05-28 23:13:10 來源:網絡 閱讀:18905 作者:BoyTNT 欄目:編程語言

WCF是DotNet體系中很重要的一項技術,但是組內很多組員通過書籍自學的時候感覺涉及面太廣、配置文件太復雜,新名詞太多、抓不到頭緒,有感于此,決定進行一次組內技術培訓,順便把培訓講義整理到blog上來。不求大而全,而是要讓初學者快速入門,因此想入實例入手,并刻意隱藏一些初期用不到的內容,以降低入門門檻。有任何錯誤歡迎指正。

注:本系列文章基于.Net Framework 3.5,以教程的最后會歸納一下到了4.0中有哪些差異。

----------------------- 分隔線 -----------------------

第一篇:入門,構建第一個WCF程序

1、服務端

建立一個控制臺應用程序作為Server,新建一個接口IData作為服務契約。這個契約接口一會兒也要放到Client端,這樣雙方才能遵循相同的標準。別忘了添加對System.ServiceModel的引用。

  1. using System;

  2. using System.ServiceModel;

  3. using System.Text;

  4. namespace Server

  5. {

  6.    /// <summary>

  7.    /// 用ServiceContract來標記此接口是WCF的服務契約,可以像WebService一樣指定一個Namespace,如果不指定,就是默認的http://tempuri.org

  8.    /// </summary>

  9.    [ServiceContract(Namespace="WCF.Demo")]

  10.    public interface IData

  11.    {

  12.        /// <summary>

  13.        /// 用OperationContract來標記此方法是操作契約

  14.        /// </summary>

  15.        [OperationContract]

  16.        string SayHello(string userName);

  17.    }

  18. }


針對這個接口建立實現類,這個類才是真正干活的,工作在服務端,不出現在客戶端:

  1. using System;

  2. using System.Text;

  3. namespace Server

  4. {

  5.    /// <summary>

  6.    /// 實現IData接口,此處不需要寫契約標記

  7.    /// </summary>

  8.    public class DataProvider : IData

  9.    {

  10.        public string SayHello(string userName)

  11.        {

  12.            return string.Format("Hello {0}.", userName);

  13.        }

  14.    }

  15. }


為工程添加一個App.config文件,這里面要定義與服務發布相關的參數。WCF中常見的做法是用代碼寫服務邏輯,但是用配置文件來定義服務發布方式,這樣做的好處是松散耦合。

  1. <?xmlversion="1.0"encoding="utf-8"?>

  2. <configuration>

  3. <system.serviceModel>

  4.  <!-- 看到services節,就表明這是在定義服務相關的內容 -->

  5.  <services>

  6.  <!-- 定義一個服務,name是契約實現類的全名 -->

  7.    <servicename="Server.DataProvider">

  8.    <!-- 既然要對外提供服務,就要有服務地址,此處定義為 http://localhost:8080/wcf,需要注意,地址總是帶著類型標頭的 -->

  9.      <host>

  10.        <baseAddresses>

  11.          <addbaseAddress="http://localhost:8080/wcf"/>

  12.        </baseAddresses>

  13.      </host>

  14.      <!-- 定義一下終節點,address一般為空,如果不為空,最終服務地址就是在baseAddress的基礎上加上這個address,binding指定為basicHttpBinding,這是最基礎的基于http的綁定方式,contract標明這是為哪個契約服務 -->

  15.      <endpointaddress=""binding="basicHttpBinding"contract="Server.IData"/>

  16.    </service>

  17.  </services>

  18. </system.serviceModel>

  19. </configuration>


萬事具備,只剩最后一步了,將服務發布出去:

  1. using System;

  2. using System.ServiceModel;

  3. namespace Server

  4. {

  5.    class Program

  6.    {

  7.        static void Main(string[] args)

  8.        {

  9.            //定義一個ServiceHost,注意參數中要使用契約實現類而不是接口

  10.            using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider)))

  11.            {

  12.                host.Open();

  13.                Console.WriteLine("Service Running ...");

  14.                Console.ReadKey();

  15.                host.Close();

  16.            }

  17.        }

  18.    }

  19. }

有人可能會問服務發布到哪去了?沒指定地址呀?這是一個初學者容易搞不明白的地方。

是的,此時App.config中的定義就發揮作用了,由于ServiceHost中指定對Server.DataProvider類服務,而App.config中定義了name="Server.DataProvider"的service,其下有endpoint,定義了綁定方式是basicHttpBinding,而http方式的baseAddress只有一個,就是 http://localhost:8080/wcf。

編譯運行,屏幕顯示Service Running ... 就是正常跑起來了,此時如果用命令行 netstat -ano | findstr "8080" 看一下,應該有如下輸出:

  1. TCP    0.0.0.0:8080         0.0.0.0:0          LISTENING      4

  2. TCP    [::]:8080            [::]:0             LISTENING      4

表示我們的程序已經在TCP 8080端口開始監聽了。值得注意的是PID是4,這是系統進程而不是我們自己的進程,這說明WCF程序對外提供HTTP服務時,是借用了系統功能(http.sys)。

此時如果我們用瀏覽器訪問一下 http://localhost:8080/wcf,不報錯,但是會提示“當前已禁用此服務的元數據發布”,這是由于默認不允許以http get方式獲取服務的WSDL,我們不用管它,不影響后面的使用,以后的章節中我們再來看這個問題。


2、客戶端

再建立一個控制臺應用程序作為Client,把Server中的接口IData拷過來,因為這是服務契約。

為工程添加一個App.config文件,這里面要定義客戶端訪問的相關參數,這里我去掉了一些用不上的參數,以保持配置文件簡單,防止各位看暈了頭。

  1. <?xmlversion="1.0"encoding="utf-8"?>

  2. <configuration>

  3.  <system.serviceModel>

  4.    <!-- 看到client,就表明是客戶端設置 -->

  5.    <client>

  6.      <!-- 定義訪問時的終節點,name也是隨意取的,注意address是Server端發布時指定的baseAddress+endpoint的address,binding也要對應,contract就更不用說了,由于之前把IData.cs拷過來的時候沒有修改命名空間,所以還是Server.IData -->

  7.      <endpointname="DataService"address="http://localhost:8080/wcf"binding="basicHttpBinding"contract="Server.IData"/>

  8.    </client>

  9.  </system.serviceModel>

  10. </configuration>


然后寫代碼,來調用Server端發布的SayHello方法:

  1. using System;

  2. using System.ServiceModel;

  3. using System.ServiceModel.Channels;

  4. namespace Client

  5. {

  6.    class Program

  7.    {

  8.        static void Main(string[] args)

  9.        {

  10.            //客戶端訪問有多種方式,此處只顯示一種

  11.            //利用ChannelFactory的CreateChannel方法創建一個IData的代理對象,其中參數“DataService”就是剛才在App.config中定義的endpoint的名稱

  12.            var proxy = new ChannelFactory<Server.IData>("DataService").CreateChannel();

  13. //調用SayHello方法

  14.            Console.WriteLine(proxy.SayHello("WCF"));

  15. //用完后一定要關閉,因為服務端有最大連接數,不關閉會在一定時間內一直占著有效連接

  16.            ((IChannel)proxy).Close();

  17.        }

  18.    }

  19. }

編譯運行,屏幕應能正常打印出“Hello WCF.”。第一個入門demo就搞定了,應該還是比較簡單的。只是App.config的配置有些復雜,后面我們會看到,其實也可以不要配置,直接用代碼搞定,不過從松散耦合的角度講不建議這么做。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

wcf
AI

仙桃市| 海原县| 八宿县| 诸暨市| 兴宁市| 贵德县| 台山市| 宜阳县| 巨鹿县| 邻水| 大田县| 青冈县| 洛南县| 井冈山市| SHOW| 邵武市| 上林县| 灵璧县| 石景山区| 仙游县| 攀枝花市| 商都县| 青海省| 藁城市| 兰西县| 柳河县| 利辛县| 永嘉县| 汤原县| 东乌珠穆沁旗| 东海县| 宁武县| 武清区| 安龙县| 柳江县| 定南县| 化隆| 和顺县| 绿春县| 盘山县| 泸州市|