通过前面的几节内容我们知道了发布WCF的几种方式,下面我们要来编写一个客户端来访问我们发布的WCF服务。

首先我们打开一个之前建立好的WCF服务程序,我的WPF服务程序还没有关闭,就使用他吧。

为这个解决方案添加一个项目,这里我添加了一个Silverlight 3 应用程序。

image

当然,你也可以选择控制台程序、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>

 

添加服务引用

image

在地址栏中输入,我们配置好的提供服务地址,点击前往,会到上面的地址中去下载WCF服务的元数据,根据接收到的元数据信息,在“服务”列表中显示出该地址中相应的服务。  如下图

image

输入一个简明有意义的命名空间,这里我用默认。

点击完成,在“解决方案管理器”中我们可以看到添加完服务引用后的项目。它会自动为我们添加System.ServiceModel、System.Runtime.Serialization两个本地引用和一个WCF服务引用。

image

还有多了一个 ServiceReferences.ClientConfig 文件

image 

里面的内容是这个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>

右击服务引用,选择“在对象浏览器中查看”,会在对象浏览器中显示出该服务引用的元数据结构。

image

我们看到,在方法栏目里面有很多事件和方法名称带有Async后缀的方法,这是为了支持Silverlight 异步通信而自动生成的,对于Silverlight使用服务,是会默认生成异步的,

image

编写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

image

更新客户端的引用

image

 

到这里我遇到了跨域的问题,我会在后面的时间里解决这个问题,但是如果你的客户端不是使用Silverlight,而是WPF,WinFrom,Asp.Net  都不会出现这个问题,唯独Silverlight。

 

如果你使用了Silverlight 而你的客户端是部署在特定的服务端口上,那么这个端口,只能限制使用4502~4534之间的端口号码,然后在943端口上开启一个服务,里为Silverlight客户端提供策略文件的配置信息

 

posted on 2009-12-25 13:21  冯瑞涛  阅读(1419)  评论(0编辑  收藏  举报