今天我给大家演示的是创建一个SilverLight客户端来调用我们上一节建立的WCF服务.

1. 打开已经创建好的wcf工程WcfService1, 点击"File/Add/New Project/”, 选择SilverLight Application, 如图所示:

2. 点击"Ok”后, vs2010询问我们是否把此Silverlight应用程序嵌入到Asp.net的网站中, 如图所示:

3. 本节我们将创建一个独立的SL应用程序, 因此去掉勾选框后, 选择"Ok".

4. 接下来我们设计SL的界面, 双击MainPage.xaml, 选择设计视图, 向其中添加一个TextBox, 一个Button和一个TextBlock, 分别命名为

_txtValue, _btnGetData, _txtResult, 并将TextBlock的TextWrapping属性设置为Wrap, 双击_btnGetData按钮为其添加单击事件.如图所示:

5. 在"解决方案视图"中, 单击Silverlight工程, 右击"引用", 选择"添加服务引用", 如图所示:

6. 点击"发现"按钮, vs2010自动把我们工程里已经创建好的WCF服务列了出来, 如图所示:

7. 将"命名空间"改为WcfService, 点击"Ok", 这时vs2010已经自动帮我们生成了调用wcf的代理类, 我们单击"解决方案视图"的工具栏的"显示所有文件"按钮, 就可以看到代理类文件Reference.cs, 如图所示:

8. 好了, wcf的服务引用我们已经完成, 现在就是如何使用wcf服务. 首先在MainPage.xaml.cs文件中添加如下代码:

using   SLClient  .WcfService  ;

private void   _btnGetData_Click  (object   sender  , RoutedEventArgs   e  )       {           int   nValue   = int  .Parse  (_txtValue  .Text  );           Service1Client   sc   = new   Service1Client  ();           sc  .GetDataCompleted   +=new   EventHandler  <GetDataCompletedEventArgs  >(sc_GetDataCompleted  );           sc  .GetDataAsync  (nValue  );       }         private void   sc_GetDataCompleted  (object   sender  , GetDataCompletedEventArgs   e  )       {           if   (e  .Error   == null  )           {               _txtResult  .Text   = e  .Result  ;           }           else             {               _txtResult  .Text   = "error"  ;           }       }

9. 上面代码实现的功能就是把textbox中输入的数字传给wcf服务, 并把调用服务后的结果赋值给textblock.

10. F7编译, F5运行后, 结果如下:

11. 这时如果我们在textBox中输入数字, 点击按钮后发现Silverlight应用程序崩溃了. 不要急, 我们一起来看看问题到底出在哪.

12. 首先, 在按钮的单击事件中放个断点 (F9), 重新运行程序, 输入数字后单击按钮.  F10单步调试之后, 相信大家都看到问题了, 执行Service1Client sc = new Service1Client ();这条语句导致程序崩溃. 原因是因为SL不支持wsHttpBinding类型的绑定. 解决方法:

1>在"解决方案视图"中右击wcf工程的web.config文件, 选择"编辑WCF设置", 如图所示:

 

如果您没有看到这个菜单项, 请退出"Asp.net开发服务", 如图所示:

2>单击"WcfService1.Service1”根下的"终结点", 把所有终结点的"绑定"类型设置为basicHttpBinding, "Dns"值置空, 保存后退出, 如图所示:

 

3>向wcf工程中添加一个新的xml文件, 并命名为crossdomain.xml, 复制下列代码到xml文件中:

xml   version  =  "1.0  "?>  DOCTYPE   cross-domain-policy   SYSTEM   "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd  ">  <  cross-domain-policy  >    <  allow-http-request-headers-from   domain  =  "*  " headers  =  "*  "/>  cross-domain-policy  >          

4>在"解决方案视图"中右击SLClient工程的"服务引用"WcfService, 选择更新服务器引用, 如图所示:

13. 再次F7编译, F5运行后, 结果如图: