一、摘要
在此次嘗試中參考了博文http://www.cnblogs.com/gaoweipeng/archive/2009/07/26/1528263.html, 此文中列舉了多種wcf的調用方式,文中提到大概五種調用方式:
1、添加服務引用的方式;
2、使用visual studio自帶的工具SvcUtil自動生成代理類的方式;
3、ChannelFactory管道工廠的方式;
4、Ajax調用WCF;
5、Js調用WCF。
我嘗試了前面三種。
二、在客戶端測試時對於WCF服務端的Web.configure的配置遇到了點問題,根本原因還不是很清楚,總結了下現象,補充如下:
1、關於終結點類型:mexHttpBinding
此終結點是用來獲取元數據的,有兩點需要注意,其一是address一定需要配置,另一點是Contract是系統的IMetadataExchange。
2、關於終結點名字的設置。
當終結點除了mexHttpBinding之外的一個時,如果不設置,在客戶端測試時採用空參的構造方法實例化客戶端代理類是沒問題的,但如果除了mexHttpBinding類型的終結點之外還有其他的,構造客戶端代理類時就必須要帶終結點名稱了,如果你沒設置,這個名稱在生成客戶端配置文件時自動產生,如果設置了終結點名稱則客戶端也是就是你設置的名稱。
3、關於終結點Address的設置,見上圖name下方的Address。
第一、對元數據的節點是必須設置Address的。
第二、建議對於你要使用的節點Address爲空,因爲如果不爲空,則客戶端產生的地址爲http://192.168.0.197/Service1.svc/ws,在我客戶端測試時總是因爲這個地址而失敗,如果爲空則測試時地址爲http://192.168.0.197/Service1.svc能正常測試。但如果有多個終結點又不能都爲空,因爲地址需要唯一。這個問題沒處理好,還需要研究下,目前我的終結點就是用的空地址測試的 。
三、測試
1、使用ScvUtil工具產生代理
在visual studio 2012中在工具欄中是沒有這個工具的,可以自己添加,添加方式:工具-》外部工具-》添加,彈出如下圖:
點擊“添加”後,輸入標題;
初始目錄爲生成文件的目錄;
命令裏面選擇:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\SvcUtil.exe
點擊確定後在tool裏面就能找到SvcUtil的工具了。
點擊後會彈出SvcUtil的工具界面,只需要輸入地址如:http://192.168.0.197/Service1.svc點擊確定就可以生成代碼了,生成完後有一個如下的控制檯提示:
此時我們建立一個控制檯應用程序就可以開始測試了。
在新建的控制檯應用程序中,找到App.config文件,將上面工具生成的配置文件output.config的內容拷貝進去,如下:
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basic" />
</basicHttpBinding>
<wsHttpBinding>
<binding name="ws" />
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://192.168.0.197/Service1.svc" binding="wsHttpBinding"
bindingConfiguration="ws" contract="IService1" name="ws">
<identity>
<servicePrincipalName value="host/WIN2008R2-Liang" />
</identity>
</endpoint>
<endpoint address="http://192.168.0.197/Service1.svc/basicHttp"
binding="basicHttpBinding" bindingConfiguration="basic" contract="IService1"
name="basic" />
</client>
</system.serviceModel>
</configuration>
將自動生成的文件Service1.cs類拷貝到客戶端工程,並改名爲Service1Client.cs.
在應用程序的Main方法中添加如下測試代碼:
Service1Client client = new Service1Client("ws");
String resultData = client.GetData(12);
Console.WriteLine("typeCode :{0}", resultData);
CompositeType type = new CompositeType();
type.BoolValue = true;
type.StringValue = "Test for wcf by liang";
CompositeType resultType = client.GetDataUsingDataContract(type);
Console.WriteLine("BoolValue :{0}, StringValue:{1} ", resultType.BoolValue, resultType.StringValue);
client.Close();
運行後即可測試成功。
2、添加服務引用的方式
這種方式和上面第一種方式是一樣的,只是自動生成代碼的方式不同而已。
在工程上面右擊-》添加服務引用-》彈出的界面輸入scv地址,確定後就會生成客戶端代碼,這種方式只有代碼沒有生成配置文件,需要自己手動配置,可以參考第一種方式的配置做對應改動即可。
測試方式也是一樣,這裏不再重複。
3、管道工廠的方式.
這種方式需要對服務端必須清楚,不需要自動生成代理,適合開發的時候測試。
測試代碼如下:
string uri = "http://192.168.0.197/Service1.svc";;
WSHttpBinding bind = new WSHttpBinding();
bind.MaxReceivedMessageSize = int.MaxValue;
bind.MaxBufferPoolSize = int.MaxValue;
bind.ReaderQuotas.MaxArrayLength = int.MaxValue;
bind.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
bind.ReaderQuotas.MaxDepth = int.MaxValue;
bind.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
bind.ReaderQuotas.MaxStringContentLength = int.MaxValue;
bind.SendTimeout = new TimeSpan(0,5,60);
EndpointAddress address = new EndpointAddress(uri);
ChannelFactory<ServiceReference1.IService1> channelFactory = new ChannelFactory<ServiceReference1.IService1>(bind);
var channel = channelFactory.CreateChannel(address);
using (channel as IDisposable)
{
string myData = channel.GetData(10);
Console.WriteLine("Get Data by Channel Factory :{0}", myData);
}
工程源碼:
http://download.csdn.net/download/ll397879213/6031769