今天我给大家演示的是创建一个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运行后, 结果如图: