通过前面的几节内容我们知道了发布WCF的几种方式,下面我们要来编写一个客户端来访问我们发布的WCF服务。
首先我们打开一个之前建立好的WCF服务程序,我的WPF服务程序还没有关闭,就使用他吧。
为这个解决方案添加一个项目,这里我添加了一个Silverlight 3 应用程序。
当然,你也可以选择控制台程序、WinForm、ASP.NET中的任何一个,甚至还可以是其它语言的应用程序,如:JavaEE等。
我们都知道,在VS2008 SP1 Silverlight Tool 3 隐藏了图形设计,将这个界面设计的功能放到了Blend 当中,这个可以理解,Expression 是强大的设计工具。
那么在这里你可以手动编写XAML,或者用Blend 编辑Silverlight 项目,拖动两个控件上来并添加事件。
<Grid x:Name="LayoutRoot">
<dataInput:Label x:Name="txtResponse" HorizontalAlignment="Left" Margin="61,152,0,0" VerticalAlignment="Top" Height="31" Width="191"/>
<Button Click="Button_Click" x:Name="btnRequest" Height="37" HorizontalAlignment="Left" Margin="37,73,0,0" VerticalAlignment="Top" Width="110" Content="调用"/>
</Grid>
添加服务引用
在地址栏中输入,我们配置好的提供服务地址,点击前往,会到上面的地址中去下载WCF服务的元数据,根据接收到的元数据信息,在“服务”列表中显示出该地址中相应的服务。 如下图
输入一个简明有意义的命名空间,这里我用默认。
点击完成,在“解决方案管理器”中我们可以看到添加完服务引用后的项目。它会自动为我们添加System.ServiceModel、System.Runtime.Serialization两个本地引用和一个WCF服务引用。
还有多了一个 ServiceReferences.ClientConfig 文件
里面的内容是这个WCF服务的配置信息
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="None">
<transport>
<extendedProtectionPolicy policyEnforcement="Never" />
</transport>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://pcserver:8008/service/basic" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
右击服务引用,选择“在对象浏览器中查看”,会在对象浏览器中显示出该服务引用的元数据结构。
我们看到,在方法栏目里面有很多事件和方法名称带有Async后缀的方法,这是为了支持Silverlight 异步通信而自动生成的,对于Silverlight使用服务,是会默认生成异步的,
编写Web端的RIA程序,异步的调用是必须的,对于网络传输不确定性很多,如果同步很可能出现假死状态,而异步会解决这个问题,Ajax就是异步的通信。
下面我们编写后台代码
namespace SilverlightApplication1
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//实例化Service1Client,它是访问WCF服务的代理类。
//可以指定终结点名称,使用哪一种配置方式,也可以什么都不写,使用默认的,在这里咱们演示可以配置的方式,写入一个终结点的名字,如下面的图,如果你在此之前没有给终结点设置名字,那么久需要设置完服务的终结点之后,更新一下客户端的引用
ServiceReference1.Service1Client client = new SilverlightApplication1.ServiceReference1.Service1Client("endpoint1");
//指定异步GetData完成后要执行的回调方法。
client.GetDataCompleted += new EventHandler<SilverlightApplication1.ServiceReference1.GetDataCompletedEventArgs>(client_GetDataCompleted);
//通过代理类,调用异步
client.GetDataAsync(8);
}
void client_GetDataCompleted(object sender, SilverlightApplication1.ServiceReference1.GetDataCompletedEventArgs e)
{
//通过e.Result 获得返回结果
txtResponse.Content = e.Result;
}
}
}
设置服务端配置终结点的名字为endpoint1
更新客户端的引用
到这里我遇到了跨域的问题,我会在后面的时间里解决这个问题,但是如果你的客户端不是使用Silverlight,而是WPF,WinFrom,Asp.Net 都不会出现这个问题,唯独Silverlight。
如果你使用了Silverlight 而你的客户端是部署在特定的服务端口上,那么这个端口,只能限制使用4502~4534之间的端口号码,然后在943端口上开启一个服务,里为Silverlight客户端提供策略文件的配置信息