Silverlight连接WCF数据服务的小例子

前段时间,经理让本人开发一个小项目,项目要求需要用到Silverlight开发界面,WCF服务连接数据库,MSSQL作为数据库。由于以前没有接触过WCF,按照微软官方的教程又会出现一些问题,导致一些错误,并且不懂得如何解决。后来,经理给了个小例子,刚开始还不太懂,不过后来慢慢理解了,觉得这个例子还不错,所以向大家分享一下。

本章主要讲到Silverlight应用程序连接WCF服务,并从WCF服务中返回一个字符串,在Silverlight中显示返回的字符串。

虽然内容听起来很简单,但是做起来还是不简单的,牵涉的东西比较多,不过慢慢地就能理解了,我尽量写得通俗易懂,以便让各位需要查看此文章的人以最快的速度和最简单的方式去学会简单地连接WCF,本文章不深入讲解WCF,详情请查看MSDN有关WCF的帮助文档,在此不再叙述。

好了,废话了那么多,下面开始进入正题:

1.创建Silverlight应用程序项目

  1.1打开VS2010,点击 新建项目 ,然后在 已安装的模板 中选择 Silverlight ,在中间区域选中 Silverlight 应用程序 ,在下面 输入 项目名称、位置和解决方案名称 ,然后点击 确定 ,创建项目,我这里保持默认的项目名称(SilverlightApplication)和路径。

  2.2在弹出的 新建 Silverlight 应用程序 对话窗体中,选中 在新网站中承载 Silverlight 应用程序 勾选项,点击 确定 ,完成项目的创建。

2.创建Web服务端的WCF服务

  2.1打开 解决方案资源管理器,里面有两个项目,名称分别是 SilverlightApplicationSilverlightApplication.Web

  2.2在 SilverlightApplication.Web 项目上 右击 - 添加 - 新建项,在 已安装的模板 中选择 Web,在 中间区域 选中 WCF服务 ,在下面 输入 WCF服务名称 ,我这里使用默认的名称 Service.svc ,点击 添加 ,完成WCF服务的添加。  添加完成后,我们可以在 SilverlightApplication.Web 项目上看到,里面添加了两个新文件,分别为 IService.vbService.svc ,这两个便是WCF服务的文件,代码如下。

IService.vb
 1 Imports System.ServiceModel
 2 
 3 ' 注意: 使用上下文菜单上的“重命名”命令可以同时更改代码和配置文件中的接口名“IService”。
 4 <ServiceContract()>
 5 Public Interface IService
 6 
 7     <OperationContract()>
 8     Sub DoWork()
 9 
10 End Interface
Service.svc
1 ' 注意: 使用上下文菜单上的“重命名”命令可以同时更改代码、svc 和配置文件中的类名“Service”。
2 Public Class Service
3     Implements IService
4 
5     Public Sub DoWork() Implements IService.DoWork
6     End Sub
7 
8 End Class

   2.3根据默认创建的代码,我们可以发现 IService 中有一个命名为 DoWork 的方法,而Service.svc(实为Service.svc.vb)中,则实现了 IService 接口。我们需要的操作,需要在 IService 接口中声明,然后在 Service.svc 中实现该方法的操作,我们在此添加一个名为 HelloWorld 的方法,该方法不传入参数,从服务端返回一个字符串,修改后的代码如下。

IService.vb
 1 Imports System.ServiceModel
 2 
 3 ' 注意: 使用上下文菜单上的“重命名”命令可以同时更改代码和配置文件中的接口名“IService”。
 4 <ServiceContract()>
 5 Public Interface IService
 6 
 7     <OperationContract()>
 8     Sub DoWork()
 9 
10     <OperationContract()>
11     Function HelloWorld() As String
12 
13 End Interface
Service.svc
' 注意: 使用上下文菜单上的“重命名”命令可以同时更改代码、svc 和配置文件中的类名“Service”。
Public Class Service
    Implements IService

    Public Sub DoWork() Implements IService.DoWork
    End Sub

    Public Function HelloWorld() As String Implements IService.HelloWorld
        Return "Hello World! The message from the WCF!"
    End Function

End Class

3.在客户端引用服务端WCF服务

  3.1在 SilverlightApplication 项目上 右击- 添加服务引用 - 发现,我们可以看到,在 服务 中有一个名为 Service.svc 的服务,那么我们应该怎样去添加这个服务呢?如果直接双击打开,是提示错误的,这是我经常犯的错误,在此列出,为了提醒大家不要犯类似我的重复错误。好了,我们转头去看怎么样解决。我们先点 取消 ,回到 解决方案资源管理器,在 SilverlightApplication.Web 项目上 右击 - 重新生成 。重新生成后,我们再按照刚才的步骤,在 SilverlightApplication 项目上 右击- 添加服务引用 - 发现,然后 双击 名字为 Service.svc 的服务,提示找到了一个服务,表示已经正常地发现到WCF服务了。如果我们 双击 Service ,可以看到 IService 接口,双击 IService 接口,我们可以查看 IService 接口中包含的方法名称。然后在下面的 命名空间 一处,填写 服务的命名空间 ,我还是保持默认的名称 ServiceReference ,点击 确定 ,已经成功地添加了一个WCF服务了。

  3.2我们打开 SilverlightApplication 项目下的 MainPage.xaml 的 MainPage.xaml.vb 代码文件。

  3.3因为我们需要用到 System.ServiceModel 命名空间,所以需要先添加该命名空间,具体操作为:顶部工具栏 - 项目 - 添加引用 - .NET - 选中 System.ServiceModel ,点击 确定  ,完成添加引用。

  3.4修改代码,创建WEB服务对象,初始化时设置对象服务绑定和服务地址,并编写调用代码,修改后的代码如下。

MainPage.xaml.vb
 1 ''' <summary>
 2 ''' 此类初始化时会调用HelloWorldMessage方法,从服务端返回一个字符串并输出该字符串
 3 ''' </summary>
 4 ''' <remarks></remarks>
 5 Partial Public Class MainPage
 6     Inherits UserControl
 7 
 8     ''' <summary>
 9     ''' Web服务对象
10     ''' </summary>
11     ''' <remarks>创建一个新的WCF服务对象,
12     ''' 来自ServiceReference(服务引用,新建WCF服务引用时候输入的命名空间名称)命名空间的
13     ''' ServiceClient(服务客户端,Service为新建WCF服务时输入的名称,加上Client组成)对象</remarks>
14     Dim webserverx As New ServiceReference.ServiceClient(GetServerBinding, GetServerUri)
15 
16     ''' <summary>
17     ''' 初始化构造函数,会调用输出从服务端返回的消息方法
18     ''' </summary>
19     ''' <remarks></remarks>
20     Public Sub New()
21         InitializeComponent()
22 
23         ''调用输出消息方法
24         HelloWorldMessage()
25     End Sub
26 
27     ''' <summary>
28     ''' 输出从服务端返回的消息方法
29     ''' </summary>
30     ''' <remarks></remarks>
31     Public Sub HelloWorldMessage()
32         ''开启异步调用服务端服务
33         webserverx.HelloWorldAsync()
34         ''如果事件中已存在调用方法,则先进行移除
35         RemoveHandler webserverx.HelloWorldCompleted, AddressOf CloseCompleted
36         ''添加调用方法至事件中
37         AddHandler webserverx.HelloWorldCompleted, AddressOf CloseCompleted
38     End Sub
39     ''' <summary>
40     ''' 输出服务端的返回值
41     ''' </summary>
42     ''' <param name="sender"></param>
43     ''' <param name="e">HelloWorld事件参数</param>
44     ''' <remarks></remarks>
45     Sub CloseCompleted(sender As Object, e As ServiceReference.HelloWorldCompletedEventArgs)
46         ''e.Result为服务端的返回值,此处返回的为一个字符串,可直接调用
47         MessageBox.Show(e.Result)
48     End Sub
49 
50     ''' <summary>
51     ''' 获取绑定类型
52     ''' </summary>
53     ''' <returns></returns>
54     ''' <remarks></remarks>
55     Private Function GetServerBinding() As ServiceModel.BasicHttpBinding
56         Dim BHB As New ServiceModel.BasicHttpBinding
57         With BHB
58             .MaxReceivedMessageSize = Integer.MaxValue
59             .MaxBufferSize = Integer.MaxValue
60         End With
61         Return BHB
62     End Function
63 
64     ''' <summary>
65     ''' 获取绑定地址
66     ''' </summary>
67     ''' <returns></returns>
68     ''' <remarks></remarks>
69     Private Function GetServerUri() As ServiceModel.EndpointAddress
70         Dim Uri As ServiceModel.EndpointAddress = Nothing
71         Try
72             Dim Path As String = Application.Current.Host.Source.AbsolutePath
73             Dim ClientBinIndex As Integer = Path.IndexOf("/ClientBin/")
74             Dim PathHand As String = ""
75             If ClientBinIndex > 0 Then PathHand = Path.Substring(0, ClientBinIndex)
76             ''注意!后面的 PathHand & "/Service.svc" 中的 Service.svc 必须与 WCF服务文件名称对应,否则会导致引用失败
77             Uri = New ServiceModel.EndpointAddress(New Uri(Application.Current.Host.Source, PathHand & "/Service.svc"))
78         Catch ex As Exception
79             MessageBox.Show(ex.ToString)
80         End Try
81         Return Uri
82     End Function
83 
84 End Class

初次发帖,难免有诸多不足,还请各位看官多多指点指点。。

原文地址:https://www.cnblogs.com/Tench/p/SilverlightConnectionWCFOfSmallExample.html