您好,登錄后才能下訂單哦!
WCF是DotNet體系中很重要的一項技術,但是組內很多組員通過書籍自學的時候感覺涉及面太廣、配置文件太復雜,新名詞太多、抓不到頭緒,有感于此,決定進行一次組內技術培訓,順便把培訓講義整理到blog上來。不求大而全,而是要讓初學者快速入門,因此想入實例入手,并刻意隱藏一些初期用不到的內容,以降低入門門檻。有任何錯誤歡迎指正。
注:本系列文章基于.Net Framework 3.5,以教程的最后會歸納一下到了4.0中有哪些差異。
----------------------- 分隔線 -----------------------
第一篇:入門,構建第一個WCF程序
1、服務端
建立一個控制臺應用程序作為Server,新建一個接口IData作為服務契約。這個契約接口一會兒也要放到Client端,這樣雙方才能遵循相同的標準。別忘了添加對System.ServiceModel的引用。
using System;
using System.ServiceModel;
using System.Text;
namespace Server
{
/// <summary>
/// 用ServiceContract來標記此接口是WCF的服務契約,可以像WebService一樣指定一個Namespace,如果不指定,就是默認的http://tempuri.org
/// </summary>
[ServiceContract(Namespace="WCF.Demo")]
public interface IData
{
/// <summary>
/// 用OperationContract來標記此方法是操作契約
/// </summary>
[OperationContract]
string SayHello(string userName);
}
}
針對這個接口建立實現類,這個類才是真正干活的,工作在服務端,不出現在客戶端:
using System;
using System.Text;
namespace Server
{
/// <summary>
/// 實現IData接口,此處不需要寫契約標記
/// </summary>
public class DataProvider : IData
{
public string SayHello(string userName)
{
return string.Format("Hello {0}.", userName);
}
}
}
為工程添加一個App.config文件,這里面要定義與服務發布相關的參數。WCF中常見的做法是用代碼寫服務邏輯,但是用配置文件來定義服務發布方式,這樣做的好處是松散耦合。
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<system.serviceModel>
<!-- 看到services節,就表明這是在定義服務相關的內容 -->
<services>
<!-- 定義一個服務,name是契約實現類的全名 -->
<servicename="Server.DataProvider">
<!-- 既然要對外提供服務,就要有服務地址,此處定義為 http://localhost:8080/wcf,需要注意,地址總是帶著類型標頭的 -->
<host>
<baseAddresses>
<addbaseAddress="http://localhost:8080/wcf"/>
</baseAddresses>
</host>
<!-- 定義一下終節點,address一般為空,如果不為空,最終服務地址就是在baseAddress的基礎上加上這個address,binding指定為basicHttpBinding,這是最基礎的基于http的綁定方式,contract標明這是為哪個契約服務 -->
<endpointaddress=""binding="basicHttpBinding"contract="Server.IData"/>
</service>
</services>
</system.serviceModel>
</configuration>
萬事具備,只剩最后一步了,將服務發布出去:
using System;
using System.ServiceModel;
namespace Server
{
class Program
{
static void Main(string[] args)
{
//定義一個ServiceHost,注意參數中要使用契約實現類而不是接口
using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider)))
{
host.Open();
Console.WriteLine("Service Running ...");
Console.ReadKey();
host.Close();
}
}
}
}
有人可能會問服務發布到哪去了?沒指定地址呀?這是一個初學者容易搞不明白的地方。
是的,此時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" 看一下,應該有如下輸出:
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 4
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文件,這里面要定義客戶端訪問的相關參數,這里我去掉了一些用不上的參數,以保持配置文件簡單,防止各位看暈了頭。
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<system.serviceModel>
<!-- 看到client,就表明是客戶端設置 -->
<client>
<!-- 定義訪問時的終節點,name也是隨意取的,注意address是Server端發布時指定的baseAddress+endpoint的address,binding也要對應,contract就更不用說了,由于之前把IData.cs拷過來的時候沒有修改命名空間,所以還是Server.IData -->
<endpointname="DataService"address="http://localhost:8080/wcf"binding="basicHttpBinding"contract="Server.IData"/>
</client>
</system.serviceModel>
</configuration>
然后寫代碼,來調用Server端發布的SayHello方法:
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
namespace Client
{
class Program
{
static void Main(string[] args)
{
//客戶端訪問有多種方式,此處只顯示一種
//利用ChannelFactory的CreateChannel方法創建一個IData的代理對象,其中參數“DataService”就是剛才在App.config中定義的endpoint的名稱
var proxy = new ChannelFactory<Server.IData>("DataService").CreateChannel();
//調用SayHello方法
Console.WriteLine(proxy.SayHello("WCF"));
//用完后一定要關閉,因為服務端有最大連接數,不關閉會在一定時間內一直占著有效連接
((IChannel)proxy).Close();
}
}
}
編譯運行,屏幕應能正常打印出“Hello WCF.”。第一個入門demo就搞定了,應該還是比較簡單的。只是App.config的配置有些復雜,后面我們會看到,其實也可以不要配置,直接用代碼搞定,不過從松散耦合的角度講不建議這么做。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。