使用WCF分布式应用程序通信.docx_第1页
使用WCF分布式应用程序通信.docx_第2页
使用WCF分布式应用程序通信.docx_第3页
使用WCF分布式应用程序通信.docx_第4页
使用WCF分布式应用程序通信.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用WCF分布式应用程序通信Windows 基础通信(WCF)是.Net框架(.Net Framework)的一个子集,它是为提升分布式应用环境的相互操作性而设计的。随着Web服务(Web services)的认可,以及相关协议和标准的诞生,使分布式应用程序发展成为了开发规范。WCF 的引入简化了面向服务的编程模型,在其基础上提供异步和非类型消息传递。从底层扩展选项和协议,让开发者在传输方式和编码方法上有很多配置选择。序言Windows 基础通信(WCF)是.Net框架(.Net Framework)的一个子集,它是为提升分布式应用环境的相互操作性而设计的。随着Web服务(Web services)的认可,以及相关协议和标准的诞生,使分布式应用程序发展成为了开发规范。WCF 的引入简化了面向服务的编程模型,在其基础上提供异步和非类型消息传递。从底层扩展选项和协议,让开发者在传输方式和编码方法上有很多配置选择。.NET Remoting, .NET Web services 和企业服务这些熟悉的技术将被认可,在WCF里就会有熟练的开发经验。除了那些老技术,WCF的序列化功能可以允许不同平台的松散藕合的分布式应用程序。这允许每个应用程序开发环境要更加独立且较少的维护。WCF可以与现有的.Net框架技术整合,如COM+、Web Services Enhancements (WSE)、消息列队或更多其他。WCF 有自己的一套术语和表达形式。在开始之前,一下内容要重点了解:查看原图通过这里了解更多WCF的术语和定义:/en-us/library/ms731079.aspx不论你是在不同的平台、整个互联网或相同的服务器上开发WCF应用程序,下面是构建WCF应用程序的步骤: 定义一个服务协定 实现协定 配置服务 托管服务 通过客户端调用服务下面的演示使用控制台应用程序来创建一个服务,并通过WPF客户端应用程序来调用该服务。这个WPF客户端应用程序可以从服务检索产品列表,展现给用户且允许用户删除个别产品。首先,用Visual Studio创建一个名为 WCFProductService 的控制台应用程序。本演示用到一个名为 Product 的类。本例子的数据将在实例运行是被创建,但是你可能需要通过数据库检索数据。using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace WCFProductService public class Product public Product() public int ProductID get; set; public string ProductName get; set; public string ProductDesc get; set; public int Inventory get; set; public ListGenerateProductList() ListreturnList = new List();returnList.Add(new Product() ProductID = 1, ProductName = Ball, ProductDesc = White, Round, Inventory = 10 );returnList.Add(new Product() ProductID = 2, ProductName = Bat, ProductDesc = Wood, Inventory = 7 );returnList.Add(new Product() ProductID = 3, ProductName = Glove, ProductDesc = Brown, Leather, Inventory = 3 );returnList.Add(new Product() ProductID = 4, ProductName = Helmet, ProductDesc = Head Protection, Inventory = 12 );returnList.Add(new Product() ProductID = 5, ProductName = Pads, ProductDesc = Body Protection, Inventory = 12 );returnList.Add(new Product() ProductID = 6, ProductName = Jersey, ProductDesc = Team Spirit, Inventory = 2 );returnList.Add(new Product() ProductID = 7, ProductName = Foam Finger, ProductDesc = Awesome, Inventory = 23 );returnList.Add(new Product() ProductID = 8, ProductName = Tape, ProductDesc = Injury prevention, Inventory = 102 );returnList.Add(new Product() ProductID = 9, ProductName = Club, ProductDesc = 9 Iron, Inventory = 11 );returnList.Add(new Product() ProductID = 10, ProductName = Bag, ProductDesc = Holds Clubs, Inventory = 6 );return returnList; Product.cs定义服务协定 要创建服务协定先通过“解决方案资源管理”添加System.ServiceModel.dll应用,然后还要用using语句给项目添加System.ServiceModel 命名空间。usingSystem.ServiceModel;Program.cs接下来定义一个名为IProductManager接口并应用ServiceContract属性。本例子指定Namespace属性的值为http:/CompanyName.ProductManager。最好给它显式指定命名空间,因为这样可防止将默认命名空间值添加到协定名称。该接口会在后面的实现服务协定中用到。在IProductManager接口中,你要给协定每个公的开操作声明一个方法。添加检索产品列表和一个删除产品的方法,给每个你想公开的方法添加OperationContract属性。当你完成的时候,该接口类似于以下代码:/ . ServiceContract(Namespace=http:/CompanyName.WCFProductService)public interfaceIProductManagerOperationContractListGetAllProducts();OperationContractvoidDeleteProduct(intn1); / .Program.cs实现协定在通过接口创建协定之后要实现该接口。创建一个名为ProductManagerService的类并实现IProductManager接口。然后实现ProductManagerService类接口里每个方法。完成后的代码应该类似于这样:/ . public classProductManagerService:IProductManagerpublicListGetAllProducts() if(MasterProductList=null)MasterProductList=newList();if(MasterProductList.Count= 0)MasterProductList=Product.GenerateProductList();returnMasterProductList;public voidDeleteProduct(intn1) if(MasterProductList=null) /throw and handle exception var productToDelete= (from pinMasterProductList where p.ProductID= n1select p).FirstOrDefault();MasterProductList.Remove(productToDelete);/ .Program.cs配置服务在实现服务协定之后,现在开始配置服务。配置服务包括确定、定义如何公开服务、协定的位置、安全类型与用于发送和接受的信息编码。WCF提供了丰富的配置选项。有两种基本的方法来设置服务配置:1、使用内嵌的代码(本演示使用)配置;2、使用配置文件(充分利用.NET框架的配置技术,当WCF服务托管在IIS里时,可以从Web.config文件来配置)。对于那些希望通过服用增增加效率的,WCF包括绑定形式的公用配置,使你可以快速更多的基本特点。绑定可以通过内嵌或配置文件里的XML元素。在本演示中,WCFProductService使用代码BasicHttpBinding绑定到配置服务。BasicHttpBinding没有提供默认的安全,因此只能应用于安全的网络环境或增加安全性。一份关于WCF提供绑定与相关细节,具体可以查看:/en-us/library/ms730879.aspx.在Main方法里添加一个具有以下属性的BasicHttpBinding对象:BasicHttpBinding binding=newBasicHttpBinding();binding.MessageEncoding=WSMessageEncoding.Text;binding.Security.Mode=BasicHttpSecurityMode.None;/default Program.cs BasicHttpBinding对象上面有很多配置各种不同方面服务的属性。需要花些时间类熟悉,因为不是所有的配置都有用。但为了保证最佳配置,有必要都了解一下。接下来的配置步骤是端点,端点是确定WCF的位置和收集有关WCF服务的信息。协定的配置信息和地址组合成端点。协定地址和配置地址已经脱离了代码或端点位置,也可以执行。(原文:The contract and configuration has already been coded leaving the address, or endpoint location, to be implemented.)在Main方法里船舰一个新Url对象,作为服务的基本地址。Uri address = new Uri(http:/localhost:8000/WCFProductService);Program.cs最后的配置是通过元素据实服务被发现。在System.ServiceModel.Description命名空间里,有一个名为ServiceMetadataBehavior 的类,该类允许你配置你的WCF服务当被请求时来发布它自身的原数据。对于那些熟悉 ASP.NET Web services 的,发现生成 WSDL 和 Web 引用同样类似地添加到你的项目。相反地,创建一个可被发现的服务,使 Web Service 代理可以在客户端创建,你将在下文中看到。为了是元素据能被找到,首先用 using 添加一个System.ServiceModel.Description引用。接下来在 Main 方法创建一个ServiceMetadataBehavior 对象,并将它的HttpGetEnabled属性设为 true。下一步,添加ServiceHost 对象。using System.ServiceModel.Description;/ .ServiceMetadataBehavior smdb = new ServiceMetadataBehavior();smdb.HttpGetEnabled = true;Program.cs提示:因为暴露的攻击与安全问题,默认情况下禁用元素据的发布。使用ServiceModel元数据使用工具代替,不需要你发布服务的元数据,你仍然能够直接从你的服务程序集产生元素据和客户端代码。托管服务现在服务已经被定义,实现和配置。该是创建服务托管对象来托管服务和通过端点发布服务的时候了。第一步,创建一个新ServiceHost对象托管WCF服务。Use the base address Uri object created in the previous step and for the implementation of the service contract use ProductManagerService.接下来给ServiceHost 对象添加服务端点。给 IProductManager 接口传递之前创建的绑定对象和端点地址(注意:这里地址是相对于基本地址的ServiceHost对象使用)。然后,启动服务,给上一步ServiceHost对象的Description.Behaviors集合创建ServiceMetadataBehavior对象。Open() 方法是ServiceHost对象告诉服务开始等待传入消息,Close() 方法停止服务。当完全这些后,Program.cs 的 Main 方法类似以下这样:/ .static void Main(string args) BasicHttpBinding binding = new BasicHttpBinding();binding.MessageEncoding = WSMessageEncoding.Text;binding.Security.Mode = BasicHttpSecurityMode.None;/ defaultUri address = new Uri(http:/localhost:8000/WCFProductService);ServiceHost productServiceHost = new ServiceHost(typeof(ProductManagerService), address);productServiceHost.AddServiceEndpoint(typeof(IProductManager), binding, ProductManager);ServiceMetadataBehavior smdb = new ServiceMetadataBehavior();smdb.HttpGetEnabled = true;try productServiceHost.Description.Behaviors.Add(smdb);productServiceHost.Open();Console.WriteLine(ProductManager Service is open!);Console.ReadLine();productServiceHost.Close();catch (CommunicationException ce)/ handle/log exception, clean up ServiceHductServiceHost.Abort();/ .Program.cs在进入下一步之前,花一分钟熟悉ServiceHost对象的所有不同可用选项,并添加端点。WCF的最大好处之一是:你有多少个选项,都可以配置它。同样的,如果你没话时间去了解什么是可用的,它也是问题的根源。为了测试服务正在运行,从Visual Studio (Vista 和 Windows 7 确保是使用管理员运行 VS )运行控制台程序,同时打开IE,进入服务调试页面地址:http:/ localhost:8000/WCFProductService.注意:如果您运行的是Windows 7中,您可能需要从管理员运行以下命令命令提示符下在IE里浏览的网页。netsh http add urlacl url=http:/+:8000/WCFProductService user=username管理员命令提示符构建一个WCF客户端最后一个重要的步骤,本演示创建一个客户端来调用刚刚创建的WCF服务。本演示见创建客户端使用Windows Presentation Foundation(WPF,但是有一点很重要:客户端可以是一个ASP.NET Web程序,JAVA程序或者任何其他WCF服务。因为WCF的服务是面向架构的,所以客户端的类型不是很重要。当多个系统和平台整合时,会出现通信问题)打开另一个Visual Studio实例,并创建一个名为WCFProductClient的WPF项目。有两个主要的方法,都能产生同样的结果。第一种是使用添加在Visual Studio服务参考向导,第二个是使用ServiceModel元数据实用工具(Svcutil.exe)WCF所提供的。如果你没有构建一个基于.NET的客户端同时WCF服务发布了元素据,可以使用 Visual Studio 快速向导的例子来快速简单生成代理。当WCF服务没有发布数据时,ServiceModel元数据实用工具将被用来生成代理。下面两个例子将演示两个长生代理的方法,在使用这两个方法之前,要确保WCF服务是运行的。使用 Visual Studio 向导,右键点击解决方案资源管理器里的引用文件夹,选择“添加服务引用”选项。输入WCF服务的基本地址,并点击“确定”向导会发现WCF服务,展现那些端点允许的端点和业务。输入要使用的代理的命名空间,然后选择“确定”。Visual Studio 会生成代理和添加所有必要的引用到客户端项目。当完成客户端项目的步骤可以开始使用WCF服务,而不要再配置。使用ServiceModel元数据实用工具,打开一个Windows SDK的控制台,并进入到要放置生成代理代码的目录。通过适当的开关用下面的命令创建代理,一旦生成后,右击 Visual Studio 解决方案的客户端项目,选择“添加”,添加存在的文件到项目中。Svcutil.exe /language:cs /out:ProductManagerService.cs /config:app.confighttp:/localhost:8000/WCFProductServiceServiceModel元数据实用工具命令不管用于生成代理的方法是怎么样的。一旦生成,很容易配置和使用WCF服务。使用 Windows Loaded 和 Button Click 事件,添加下面WCF客户端代码。private void Window_Loaded(object sender, RoutedEventArgs e) ServiceR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论