Visual Studio 2008 支持的WCF

来源:互联网 发布:利用淘宝漏洞赚钱技巧 编辑:程序博客网 时间:2024/05/09 17:41
[原文作者]:Chris Smith and John Stallo
[原文链接]:A Walkthrough of WCF Support in Visual Studio 2008
 
在这里, 我想强调一个Visual Studio 2008支持的功能: Windows Communication Foundation(WCF)。在.NET Framework 3.0中,WCF作为下一代的communications API-在以前,如果你希望应用程序间对话,你需要提前确定一些事情:
·         传递速度有多重要?
·         应用程序如何会话?通过互联网,内联网,或者在同一台计算机上?
·         可靠性重要吗?
·         消息加密重要吗?
一旦确定了这些问题并且开始编写程序的时候,你将被迫去学习新的协议[.NET  Remoting, ASMS Web Services, MSMQ, 命名管道(Named pipes)等等],并且要使用这些特定的API实现你的解决方案。问题是,在这种方式下,你的代码不会优美的适应变化。如果需求有了很大改动,你就需要用可以支持任何关键功能的API来重新编写整个通讯层。
WCF通过提供统一的编程接口而解决了这个问题,从而你就可以只学一种API和工具了。它通过隔离不同的通讯要素[比如协议(protocols)、消息合同(message contracts)等等]来实现这一点。有了WCF, 就不用担心每一个消息是如何在服务器和客户端之间传递的,你只需把精力集中在服务和消息合同(message contracts)上,也就是说,你在客户端能够调用什么方法,以及数据返回的结构。所有的通讯协议都可以被配置(在App.config中),而不用放在代码里。以上是我们从整体上了解WCF,现在让我们钻研一下它在Visual Studio 2008中能为我们做什么。
我们会创建一个明为“Northwind Traders”的三层架构应用程序。我们的解决方案包括四个工程:数据访问层、WCF服务、WinForm客户端和一个商业逻辑组件。在此过程中,我们会强调Visual Studio 2008一些主要的新功能,并且证明编写一个以数据为中心的应用程序是多么容易。
创建数据访问层
要创建数据访问层,我们首先创建一个新的Class Library 工程,命名为“DataAccessLayer”。
用Visual Studio开发N层应用程序,一个常见的问题是它把表适配器(TableAdapters)和类型化数据集(typed DataSets)放在同一个工程里。它的不幸在于,这样会泄露一些敏感信息,比如连接字符串(connection strings)。那么如何重用类型化数据集(typed DataSets)并保持表适配器私有(TableAdapters)呢?目前相当多的开发工具都不能直接实现,幸运的是,Visual Studio 2008解决了这个问题。
在Visual Studio 2008里,一旦创建了数据访问层,你就可以通过配置数据集设计器(DataSet Designer)来将数据集的代码生成到系统一个单独的工程中。这样你就可以在不暴露连接字符串(connection strings)的情况下,实现类型化数据集(typed DataSets)的共享和重用。
添加另外一个类库(class library)工程到系统中,命名为“NorthwindBuisnessObjects”。
然后重新打开NorthwindDataSet并且在属性窗口中把“DataSet Project’”的值设为“NorthwindBuisnessObjects”。现在,生成一下工程(Build the Project),NorthwindBuisnessObjects工程就会自动产生一个NorthwindDataSet.DataSet.Designer.vb文件。
接下来我们往数据集(DataSet)里加一些简单的验证逻辑。双击数据集设计器(DataSet Designer),并把一下的代码加进去(注意:在正确的工程中,DataSet.vb会自动生成)。
PartialClass NorthwindDataSet
    PartialClass OrdersDataTable
 
        PrivateSub OrdersDataTable_OrdersRowChanging(ByVal sender As System.Object, ByVal e As OrdersRowChangeEvent) HandlesMe.OrdersRowChanging
 
        EndSub
 
        PrivateSub OrdersDataTable_ColumnChanged(ByVal sender AsObject, ByVal e As System.Data.DataColumnChangeEventArgs) HandlesMe.ColumnChanged
            If e.Column.ColumnName = Me.OrderDateColumn.ColumnName Or e.Column.ColumnName = Me.ShippedDateColumn.ColumnName Then
                ValidateDates(e.Row)
            EndIf
        EndSub
 
        '*********************************************
        '我的数据集的客户验证逻辑
        '*********************************************
        PrivateSub ValidateDates(ByVal row As OrdersRow)
            If row.OrderDate > row.ShippedDate Then
                row.SetColumnError(Me.OrderDateColumn, "Can't ship before it's been ordered")
                row.SetColumnError(Me.ShippedDateColumn, "Can't ship before it's been ordered")
            Else
                row.SetColumnError(Me.OrderDateColumn, "")
                row.SetColumnError(Me.ShippedDateColumn, "")
            EndIf
        EndSub
    EndClass
EndClass
 
最后再加入一个命名为“NorthwindManager”的类(class),它的作用是连接数据库(database)并且返回表(tables)。这样,我们的数据访问层就完成了。
 Imports NorthwindBuisnessObjects
 PublicClass NorthwindManager
 
    PublicSharedFunction GetCustomers() As NorthwindDataSet.CustomersDataTable
 
        Dim customerAdapter AsNew NorthwindDataSetTableAdapters.CustomersTableAdapter()
 
        Return customerAdapter.GetData()
 
    EndFunction
 
    PublicSharedFunction GetOrders() As NorthwindDataSet.OrdersDataTable
 
        Dim orderAdapter AsNew NorthwindDataSetTableAdapters.OrdersTableAdapter()
 
        Return orderAdapter.GetData()
 
    EndFunction
 
EndClass
 
创建WCF服务
下面创建一个WCF服务。这和创建ASMX Web服务很类似。我们创建一个WCF Web服务工程(WCF Web Service Project),也就是创建一个新的由IIS管理(host)的WCF服务。
注意,WCF并不一定是基于Web的服务。Visual Studio 2008也为服务库(service libraries)提供了工程模板(project templates),这是WCF服务就被包装在类库(class libraries)里。另外我们有一个可以调试WCF服务的“Test Form”,这里不作讨论。
建立好服务工程(service project),我们添加指向DataAccessLayer和BuisnessObjects工程的引用。
然后我们把默认的服务合同(contract)改为我们自己的。<ServiceContract()> 和 <OperationContract()>说明这是一个WCF服务合同(contract)。
Imports NorthwindBuisnessObjects
 
<ServiceContract()> _
PublicInterface IService
 
    <OperationContract()> _
    Function GetCustomers() As NorthwindDataSet.CustomersDataTable
 
    <OperationContract()> _
    Function GetOrders() As NorthwindDataSet.OrdersDataTable
 
EndInterface
 
然后对服务合同(service contract)的实现进行相应的改变
Imports NorthwindBuisnessObjects
Imports DataAccessLayer
 
PublicClass Service
 
    Implements IService
 
    PublicFunction GetCustomers() As NorthwindDataSet.CustomersDataTable Implements IService.GetCustomers
 
        Return DataAccessLayer.NorthwindManager.GetCustomers()
 
    EndFunction
 
    PublicFunction GetOrders() As NorthwindDataSet.OrdersDataTable Implements IService.GetOrders
 
        Return DataAccessLayer.NorthwindManager.GetOrders()
 
    EndFunction
 
EndClass
 
创建WCF客户端
截止到目前,我们的服务器端已经完成了,现在我们创建一个Windows窗体程序(WinForm Applicaition)来使用它。然后再解决方案资源管理器(Solution Explorer)中右击窗体程序(Winform)工程,选中“添加服务引用(Add Service Reference…),这时就会弹出以下对话框:
在图中,服务已经被列出来了。对于已知的Web服务(Web Services),不论ASMX 还是WCF, 都可以将其地址输入到服务URL,然后点击”Go”对于本解决方案(Solution)中的服务,只需点击“发现”(Discover),所有的服务就会被列出来。
 点击“高级”(Advanced),“服务引用设置对话框”(Service Reference Settings dialog)就会被弹出:
我们可以在这个对话框中配置WCF服务引用,但是在80%的情况下用默认选项就可以了。也可以在添加服务应用完成后,在打开这个对话框进行配置。在Visual Studio 2005中,为了改变Web引用的一些高级属性,我们得用命令行和开发工具包(SDK)来重新生成代理(Proxy);而在Visual Studio 208中,我们就可以在集成开发环境(IDE)中直接配置服务引用。
 代理类型重用
现在我们谈一下Visual Studio 2008WCF最酷的功能之一:代理类型重用。在这之前,我们先看看问题所在。打开生成的代理代码proxy code我们看到服务返回“NorthwindDataSet’类型,但它不是指BuisnessObjects.NorthwindDataset类型而是Client.ServiceReference.NorthwindDataSet”。这个生成的类型是个假像:看起来可以序列化(serialized/反序列化deserialized),但他并不包含数据集DataSet的实际方法,也就是我们所说的验证逻辑。
这就引出了“面向服务的构架”:客户端和服务端可以把一个对象序列化(serialize)为同一种格式,而不考虑对象本身是什么类型(甚至不必考虑是什么语言,实际上,JAVA程序员就可以使用WCF服务)。
但是我们不希望使用那个“假的” NorthwindDataSet,因为那样意味着要在两个地方维护验证逻辑的两个版本。因为我们可以同时控制客户端和服务器端,代理类型重用允许我们重用结合了验证逻辑的基本数据类型。在ASMX Web服务中,必须用命令行工具来实现这种代码重用,而Visual Studio 2008默认实现了它。
要实现代理类型重用,只要在我们的客户端添加一个应用到NorthwindBuisnessObjects。然后再解决方案资源管理器(Solution Explorer)右击“服务引用”(ServiceReference)并选中“更新”(Update)。这样服务引用就被更新,而服务代理业被重新生成。默认情况下,我们扫描所有的工程引用并重用它们,所以生成的代理并不会暴露NorthwindBuisnessObjects工程中的数据表(datatables)。
 
下面我想谈一下WCF服务引用生成的配置文件。打开客户端的app.config文件,你会发现一个新的Section“<system.serviceModel >”,它包含了WCF服务引用的所用设置。同时,服务器端也有一个类似的web.config文件。
考虑到安全角度,这个客户端配置文件默认设定最大接受信息长度(MaxRecievedMessageSize)为65536:如果在运行时(runtime)服务器端向客户端发送的数据超过它的最到值的,就会抛出异常。因为要传输很大的数据集(DataSets),我们打开app.config文件并把元素(element)“<bindings>/<wsHttpBinding>/<binding>”的值设为5000000。如果你不想在配置文件中手动改,就用工具(Tools)菜单下的微软服务配置编辑器(Microsoft Service Configuration Editor)。
目前,我们已经正确的添加和配置了我们的服务。接下来我们对服务返回的数据表(data tables)做一下数据邦定(data binding)。打开数据源窗口(Data Sources window),把表(table)“Orders”拖拽到Form1上。
最后,为了从我们的WCF服务获取数据,我们在Form1的OnLoad事件中添加一些代码。
PublicClass Form1
 
    Private m_serviceClient AsNew ServiceReference.ServiceClient()
 
    PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
 
        Me.OrdersBindingSource.DataSource = m_serviceClient.GetOrders()
 
    EndSub
 
EndClass
一切就绪!按“F5”运行我们的程序!
现在我们有了一个三层构架的程序,它通过一个孤立的数据访问层,从WCF服务端获取数据。还记得我说过代理类型重用很酷吗?这就是原因:由于在重用同一个数据集类型,我们可以借用BusinessObjects层验证逻辑的优势。试一下改变ShippedDate 的值,让它小于OrderData。
注意,DataGrid会显示一个错误并给出提示信息。
总结
我们论证了如何利用WCF、代理类型重用(ProxyTypeSharing)和其他的新功能来组织数据层。最后的结果是:我们可以用最短的时间创建一个强大的应用程序。不过,这只是WCF最普通的应用而已。
[有关WCF的更多信息请参考:]
MSDN上的WCF资料:http://msdn2.microsoft.com/en-us/library/ms735119.aspx  
 
原创粉丝点击