一个简单WCF项目的建立 by wsz
? ? ? 由于搬磚的需要,不得不學(xué)一點(diǎn)與WCF有關(guān)的東西。具體是因?yàn)榍皫字茉?4位環(huán)境下寫的一個(gè)dll不能被集成到合作伙伴的32位工程中,但是要修改文件實(shí)在是劃不來,一個(gè)壓縮后600M的文件搬來搬去的也是讓人蛋碎。因此想到了WCF。這樣只要提供一個(gè)service,運(yùn)行一個(gè)host,然后在client上調(diào)用就可以了。貌似是一件很簡單的事,但是卻做了整一下午還多。
WCF的確是個(gè)好東西,從功能來看,WCF可以看作是ASMX,.Net?Remoting,Enterprise?Service,WSE,MSMQ等很多我不懂的技術(shù)的并集。WCF中支持的傳輸協(xié)議包括HTTP、TCP、Peer network等很多我不懂的協(xié)議。簡單介紹一下HTTP,和TCP的地址類型,大概是這樣子的:
HTTP地址
? ? ? ? 即使用HTTP協(xié)議進(jìn)行傳輸(包括https安全傳輸協(xié)議)。其地址形式為
? ? ? ? http://localhost:8000/
? ? ? ? 如果地址中為制定端口號(hào),則默認(rèn)端口為80
TCP地址
? ? ? ? 使用TCP協(xié)議進(jìn)行傳輸,其形式為:
? ? ? ? net.tcp://localhost:8000/
下午經(jīng)歷了一個(gè)由HTTP到TCP過度的一個(gè)痛苦過程。個(gè)人感覺TCP要比HTTP麻煩那么一點(diǎn)。就用HTTP協(xié)議簡單介紹一下這個(gè)建立過程。
?
一個(gè)簡單的WCF
建立host可以用兩種方式,一種是直接建立一個(gè)WCF服務(wù)集+一個(gè)host項(xiàng)目,另一種是建立兩個(gè)類庫+一個(gè)host項(xiàng)目。直觀的區(qū)別是用服務(wù)集可以將interface和service放在一個(gè)項(xiàng)目下;否則就是用一個(gè)類庫作為interface,另一個(gè)作為service。這里就用兩個(gè)類庫為例吧。先在解決方案中添加一個(gè)類庫取名Contract作為服務(wù)契約(要添加ServiceModel的引用),在建立一個(gè)Service類庫(要添加ServiceModel和Contract的引用)。在Contract中寫一個(gè)簡單的interface如下(用來計(jì)算a與b的和):
namespace Contract
{
??? [ServiceContract]
??? public interface ICaculate
??? {
??????? [OperationContract]
??????? int Caculate(int a,int b);
??? }
}
[ServiceContract]表示服務(wù)契約,就是在ServiceModel的引用下的。
在Service中實(shí)現(xiàn)這個(gè)類
namespace Service
{
??? public class myCaculate:ICaculate
??? {
??????? public int Caculate(int x, int y)
??????? {
??????????? return x + y;
??????? }
??? }
}
接下來添加一個(gè)Host項(xiàng)目比如一個(gè)控制臺(tái)程序,大概是這樣的(要把Host設(shè)置為主項(xiàng)):
?
在Host項(xiàng)目中要添加ServiceModel,Service和Contract的引用。這里有兩種方式寫Program中的代碼。一種是直接在代碼寫協(xié)議的類型,另一種是在App.config中設(shè)置協(xié)議。這里用配置文件的方式,因?yàn)檫@樣host中的代碼會(huì)非常簡單,而且個(gè)人感覺App.config在WCF中扮演一個(gè)很犀利的角色。這需要我們先生成一個(gè)大概的App.config代碼框架,再根據(jù)具體情況設(shè)置參數(shù)(如果整個(gè)配置文件都是手寫的,那只能Or2)。具體的編輯工具在VS2010的工具à服務(wù)配置編輯器中。打開Host中的配置文件,主要的任務(wù)是添加service和behavior,此外要建立一個(gè)url作為endpoint。這里選擇basicHttpBinding綁定方式。具體操作很簡單就不贅述了,用起來很方便。重要的是設(shè)置完成之后別忘了保存,否則就白費(fèi)了。生成的配置文件大概是這樣的:
<?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函數(shù)中代碼就很簡單了
ServiceHost host = new ServiceHost(typeof(myCaculate));
??????????? host.Open();
??????????? Console.WriteLine("Start Your Service.");
??????????? Console.ReadKey();
??????????? host.Close();
這么幾行就夠了。這樣host就可以運(yùn)行了。接下來建立一個(gè)控制臺(tái)程序作為Client。建立好之后,先讓Host運(yùn)行起來,然后在client的引用中添加ServiceReferences http://localhost:8080/HelloService。
這樣在Client的代碼中就可以調(diào)用Service中的myCaculate類來計(jì)算兩個(gè)數(shù)的和了。
在Client中可以直接調(diào)用Service(代碼比較麻煩)或者通過代理調(diào)用(簡單多了)。
代理調(diào)用的代碼如下:
ServiceReference1.CaculateClient ca = new ServiceReference1.CaculateClient();
??????? Console.WriteLine(ca.Caculate(6, 7));
一個(gè)簡單的http協(xié)議的WCF就是在這樣了。在Host的App.Config中可以進(jìn)行很多參數(shù)的設(shè)定,比如傳輸?shù)淖畲笞止?jié),timeout等。都根據(jù)具體的需要進(jìn)行設(shè)定。對于TCP協(xié)議的要麻煩一點(diǎn)。不過大體流程是一樣的。
??????? ?WCF的跨平臺(tái)性很好,而且集成了多種協(xié)議,微軟的這個(gè)產(chǎn)品的確令人佩服。
轉(zhuǎn)載于:https://www.cnblogs.com/smart-code/archive/2012/08/30/2664665.html
總結(jié)
以上是生活随笔為你收集整理的一个简单WCF项目的建立 by wsz的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库中char, varchar, n
- 下一篇: iOSUIImage变为NSData并进