一、摘要
在此次尝试中参考了博文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.youkuaiyun.com/download/ll397879213/6031769