由於搬磚的需要,不得不學一點與WCF有關的東西。具體是因為前幾周在64位環境下寫的一個dll不能被集成到合作伙伴的32位工程中,但是要修改文件實在是划不來,一個壓縮后600M的文件搬來搬去的也是讓人蛋碎。因此想到了WCF。這樣只要提供一個service,運行一個host,然后在client上調用就可以了。貌似是一件很簡單的事,但是卻做了整一下午還多。
WCF的確是個好東西,從功能來看,WCF可以看作是ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等很多我不懂的技術的並集。WCF中支持的傳輸協議包括HTTP、TCP、Peer network等很多我不懂的協議。簡單介紹一下HTTP,和TCP的地址類型,大概是這樣子的:
HTTP地址
即使用HTTP協議進行傳輸(包括https安全傳輸協議)。其地址形式為
http://localhost:8000/
如果地址中為制定端口號,則默認端口為80
TCP地址
使用TCP協議進行傳輸,其形式為:
net.tcp://localhost:8000/
下午經歷了一個由HTTP到TCP過度的一個痛苦過程。個人感覺TCP要比HTTP麻煩那么一點。就用HTTP協議簡單介紹一下這個建立過程。
一個簡單的WCF
建立host可以用兩種方式,一種是直接建立一個WCF服務集+一個host項目,另一種是建立兩個類庫+一個host項目。直觀的區別是用服務集可以將interface和service放在一個項目下;否則就是用一個類庫作為interface,另一個作為service。這里就用兩個類庫為例吧。先在解決方案中添加一個類庫取名Contract作為服務契約(要添加ServiceModel的引用),在建立一個Service類庫(要添加ServiceModel和Contract的引用)。在Contract中寫一個簡單的interface如下(用來計算a與b的和):
namespace Contract
{
[ServiceContract]
public interface ICaculate
{
[OperationContract]
int Caculate(int a,int b);
}
}
[ServiceContract]表示服務契約,就是在ServiceModel的引用下的。
在Service中實現這個類
namespace Service
{
public class myCaculate:ICaculate
{
public int Caculate(int x, int y)
{
return x + y;
}
}
}
接下來添加一個Host項目比如一個控制台程序,大概是這樣的(要把Host設置為主項):
在Host項目中要添加ServiceModel,Service和Contract的引用。這里有兩種方式寫Program中的代碼。一種是直接在代碼寫協議的類型,另一種是在App.config中設置協議。這里用配置文件的方式,因為這樣host中的代碼會非常簡單,而且個人感覺App.config在WCF中扮演一個很犀利的角色。這需要我們先生成一個大概的App.config代碼框架,再根據具體情況設置參數(如果整個配置文件都是手寫的,那只能Or2)。具體的編輯工具在VS2010的工具à服務配置編輯器中。打開Host中的配置文件,主要的任務是添加service和behavior,此外要建立一個url作為endpoint。這里選擇basicHttpBinding綁定方式。具體操作很簡單就不贅述了,用起來很方便。重要的是設置完成之后別忘了保存,否則就白費了。生成的配置文件大概是這樣的:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Behavior0">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="Behavior0" name="Service.myCaculate">
<endpoint address="http://localhost:8080/HelloService" binding="basicHttpBinding"
bindingConfiguration="" contract="Contract.ICaculate" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/HelloService" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
Behavior的名字是隨便取的,這里的url是http://localhost:8080/HelloService。
這樣host的main函數中代碼就很簡單了
ServiceHost host = new ServiceHost(typeof(myCaculate));
host.Open();
Console.WriteLine("Start Your Service.");
Console.ReadKey();
host.Close();
這么幾行就夠了。這樣host就可以運行了。接下來建立一個控制台程序作為Client。建立好之后,先讓Host運行起來,然后在client的引用中添加ServiceReferences http://localhost:8080/HelloService。
這樣在Client的代碼中就可以調用Service中的myCaculate類來計算兩個數的和了。
在Client中可以直接調用Service(代碼比較麻煩)或者通過代理調用(簡單多了)。
代理調用的代碼如下:
ServiceReference1.CaculateClient ca = new ServiceReference1.CaculateClient();
Console.WriteLine(ca.Caculate(6, 7));
一個簡單的http協議的WCF就是在這樣了。在Host的App.Config中可以進行很多參數的設定,比如傳輸的最大字節,timeout等。都根據具體的需要進行設定。對於TCP協議的要麻煩一點。不過大體流程是一樣的。
WCF的跨平台性很好,而且集成了多種協議,微軟的這個產品的確令人佩服。