建立完成以后,VS將自動生成1個最簡單的WCF工程,在這個利用中,包括了最基本Contract、Service。
工程以下:
不需要編輯任何文件,直接編譯生成,得到1個WcfService1.dll文件
2、WCF利用中的契約(Contract)
在生成的WCF工程中,IService1.cs中為Contract(本例中契約和服務放在同1個工程下了,實際上也能夠分為兩個工程),代碼以下:
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
[Operation Contract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get {return boolValue; }
set {boolValue = value; }
}
[DataMember]
public string StringValue
{
get {return stringValue; }
set {string Value = value; }
}
}
可以看到,聲明了服務契約IService1,以接口情勢聲明,其中還包括兩個操作契約GetData和GetDataUsingDataContract。還聲明了數據契約CompositeType,以類的情勢聲明,包括兩個數據成員BoolValue和StringValue。
3、WCF利用中的服務功能實現(ServiceBehavior)
在生成的WCF利用中,Service1.svc.cs中為“ServiceBehavior”(本例中契約和服務放在同1個工程下了,實際上也能夠分為兩個工程),代碼以下(Service1.svc還有其它作用,后面再說):
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}",value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite== null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue+= "Suffix";
}
return composite;
}
}
可以看到,這個Service1類實現了在契約中聲明的IService1接口(服務契約),也使用到了CompositeType類(數據契約);實現了GetData和GetDataUsingDataContract這兩個服務契約中功能,這些功能即為WCF服務允許外部程序進行調用的功能。
4、寄宿(Host)WCF服務
有2種常見的寄宿方式:
1)1種是為1組WCF服務創建1個托管的利用程序,通過手工啟動程序的方式對服務進行寄宿,所有的托管的利用程序都可作為WCF服務的宿主,比如 Console利用、Windows Forms利用和ASP.NET利用等,我們把這類方式的服務寄宿方式稱為自我寄宿(Self Hosting)。
2)另外一種則是通過操作系統現有的進程激活方式為WCF服務提過宿主,Windows下的進程激活手段包括IIS、Windows Service或WAS(Windows Process Activation Service)等
不管采取哪一種寄宿方式,在為某個服務創建 ServiceHost的進程中,WCF框架內部會履行1系列的操作,其中最重要的步驟就是為服務創建服務描寫(Service Description)
本例以第1種為例,建立1個WinForm利用作為托管程序,在VS2010中,建立1個普通的WinForm程序(以frameword4.0為例),以下圖:
在工程中,添加對System.ServiceModel的援用,并添加對剛才生成的WcfService1.dll的援用,然后在Form上添加1個Button和1個Label控件,以下圖:
在WinForm工程中添加對要托管的WCF服務的描寫,既可以通過代碼實現,也能夠通過工具生成。本例在VS2010下,通過Tools-WCF Service Configeration Editor工具生成。
點開后,通過菜單的File-New Config新建1個描寫文件,然后點擊Service頁面的Create a New Service,彈出以下界面:
點擊Browse...按鈕,選中剛才生成的WcfService1.dll,并選中其中的Service1服務,點擊下1步,彈出以下界面:
這個界面中要選擇使用的契約,默許便可,點擊下1步,彈出以下界面:
這個界面中要選擇使用的網絡通訊協議,選擇最通用的HTTP協議,并在下1個界面當選擇基本的Http服務(Basic WebService interoperablitity),
在接下來的界面中,輸入訪問地址,其它程序可以通過這個地址來訪問本WCF服務。
完成這1步以后,接下來還有1些設置,我也不清楚用處,略去,最后點擊File-Save,生成1個App.config文件。這里把該文件貼上來:
<?xml version="1.0" encoding="utf⑻"?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="NewBehavior0">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8585/wcf1/metadata" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="NewBehavior0" name="WcfService1.Service1">
<endpoint address="" binding="basicHttpBinding"
bindingConfiguration="" name="ep1" contract="WcfService1.IService1" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8585/wcf1" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
把該App.config文件放在與WinForm工程的根目錄下(與Form1.cs同1目錄),還需要在VS中將該文件加入到工程中。
添加Button控件的處理函數:
private void button1_Click(objectsender, EventArgs e)
{
System.ServiceModel.ServiceHosthost =new System.ServiceModel.ServiceHost(typeof(WcfService1.Service1));
host.Open();
this.label1.Text= "opened";
}
編譯運行,點擊界面中的Button控件,便可以將該WCF服務寄宿到該Frm中(關閉窗體后WCF服務結束)。
注:如果運行時報這個毛病(HTTP could not register URL http://+:8585/wcf1/. Your process does not have http://www.vxbq.cn/access/ rights to this namespace),有多是權限不足致使,需要使用管理員權限運行。
5、在客戶端訪問并調用WCF服務
新建1個WinFrm工程(不要關閉剛才的寄宿界面),在VS菜單中點擊Project-Add Service Reference..項,輸入剛才在寄宿界面中定義的地址,就能夠添加對該WCF服務的援用,以下圖:
在程序中使用以下代碼,便可以調用WCF服務中的GetData方法:
ServiceReference1.Service1Clientaa=newServiceReference1.Service1Client();
MessageBox.Show(aa.GetData(2));
6、總結
WCF1個簡單的利用,剛剛接觸,以后還有更多機會去深入學習。