前篇Learn WCF (2)--開發WCF服務介紹了開發服務程序,這篇開發一個客戶程序,主要有三種方案:
添加一個Web引用
使用svcutil.exe工具
編程方案
1.添加一個Web引用
這個和添加引用Web服務的方法基本一致,在添加引用的對話框中輸入URL:http://localhost:39113/WCFServiceText/WCFStudentText.svc
為WCF起個名字,點擊添加引用按鈕將會完成如下的任務:
(1)從指定的URL為學生管理服務下載WSDL文件
(2)生成代理類WCFStudentText,它是服務器WCFStudentText的代理,實現了服務器契約IStuServiceContract。
(3)生成響應的配置設置
現在我們就可以用代理類WCFStudentText與學生信息管理服務進行通信了。在站點中添加一個頁面,放入一個GridView和ObjectDataSource
<div>
<asp:GridView ID="GridView1" runat="server" BackColor="White"
BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px" CellPadding="4"
DataSourceID="ObjectDataSource1" ForeColor="Black" GridLines="Vertical">
<RowStyle BackColor="#F7F7DE" />
<FooterStyle BackColor="#CCCC99" />
<PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
<SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="StuWcfService.WCFStudentText" SelectMethod="GetStudent">
</asp:ObjectDataSource>
</div>
ObjectDataSourse的優點是不需要編寫一行代碼就可以調用代理類中的方法。這裡應當注意的是TypeName,SelectMethod兩個重要屬性的寫法,必須與代理類一致。
2.使用svcutil.exe工具
WCF帶有一個工具svcutil.exe,它自動從指定的URL下載WSDL文檔,為代理類生成並保存一個指定的文件中,用相應的配置設置生成相應的配置文件,執行下面命令:
svcutil.exe工具將自動完成下列工作:
(1)通過URL下載元數據文檔(WSDL文檔)。
(2)為代理類生成代碼,並將代碼保持到WCFStudentServiceClient.cs文件中。
(3)生成配置設置並將其保存到Web.config中。
檢查svcutil.exe多運行的目錄,就會看到文件WCFStudentServiceClient.cs和Web.config。文件中的代碼這裡就不考出來了,大家可以自己試一下。將這兩個文件導入到一個站點中。
只需將ObjectDataSource的代碼改為:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="代理類名" SelectMethod="調用的方法名">
</asp:ObjectDataSource>
這樣就可以了。
3.編程方案
這裡我們主要根據svcutil.exe給我們生成的文件,手動的編寫自己的代碼,實現同樣的效果。svcutil.exe生成的代理類文件中包含了5個構造函數,目的是為了滿足不同情況下的需要:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class StuServiceContractClient : System.ServiceModel.ClientBase<IStuServiceContract>, IStuServiceContract
{
public StuServiceContractClient()//默認構造函數
{
}
public StuServiceContractClient(string endpointConfigurationName) :
base(endpointConfigurationName)//參數是一個字符串,包括端點的配置名
{
}
public StuServiceContractClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)//端點的配置名,端點的網絡地址
{
}
public StuServiceContractClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)//端點的配置名,端點地址的EndPointAddress對象
{
}
public StuServiceContractClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)//端點綁定的Binding對象,端點地址的EndPointAddress對象
{
}
public void AddStudent(WCFStudent.Student stu)
{
base.Channel.AddStudent(stu);
}
public WCFStudent.Student[] GetStudent()
{
return base.Channel.GetStudent();
}
}
其中端點的配置名是<client>下<endpoint>子元素下的name屬性。
我們也可以編寫同樣的代碼。來實現WCF服務的應用。就寫到這啦。