.Net remoting, Webservice,WCF基础
传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(service)。比如,让一个杀毒软件在后台运行,它会自动监控系统,那么这种自动监控就是一个"服务"。 通俗地说,"服务"就是计算机可以提供的某一种功能。 根据来源的不同,"服务"又可以分成两种:一种是"本地服务"(使用同一台机器提供的服务,不需要网络),另一种是"网络服务"(使用另一台计算机提供的服务,必须通过 网络才能完成)。"网络服务"(Web Service)的本质,就是通过网络调用其他网站的资源。举例来说,去年我写过一个"四川大地震图片墙",它能动态显示关于四川地震的最新 图片。但是,所有的图片都不是储存在我的服务器上,而是来自flickr.com。我只是发出一个动态请求,要求flickr.com向我提供图片。这种情况下,flickr.com提供的就是一种 Web service。如果我把图片都存放在本地服务器,不调用flickr.com,那么我就是在 使用"本地服务"。所以,Web service让你的网站可以使用其他网站的资源,比如在网页上显示天气、地图、twitter上的最新动态等等。 综上:WebService是两个计算机之间通讯(交谈)的技术。并且现在炒的很火的SOA、云计算在技术层面上都是WebService。 除了WebService 通讯外,系统间通讯有很多种技术,如像qq的这种Socket通讯在银行系统中广泛应用,.Net Remoting、DCom等通讯方式也应用很 多, 但是这些方式有如下缺点: ? 通讯数据格式不统一,同样一个"你好"这样的字符串在不同的协议中有不同的表示方法,异构系统集成很麻烦。一个系统一个模样。 ? 采用Socket、 .Net Remoting、DCom需要打开很多端口,而企业网络安全的一个基本原则就是“尽可能少的打开端口”,很多企业网络甚至严格规定“只能打开80端口”, 因此需要一种“跨防火墙”的技术(跨防火墙就是走80端口进行通讯) ? 这些通讯方式的协议是不开放的,要想知道服务提供了哪些方法、如何调用,必须能够自描述 WSDL(Web Service Description Language) 你会怎样向别人介绍你的Web service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的Web service的人。 这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的Web service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码 Web服务器描述语言是用XML文档来描述Web服务的标准,是Web服务的接口定义语言,由Ariba、Intel、IBM、MS等共同提出,通过WSDL,可描述Web服务的三个基本属性: ·服务做些什么——服务所提供的操作(方法) ·如何访问服务——和服务交互的数据格式以及必要协议 ·服务位于何处——协议相关的地址,如URL
XML和XSD 请求、返回的XML数据格式(有哪些节点、节点的名字等等)WebService 用SOAP协议进行规定,方法描述信息XML用WSDL协议规定。WebService技术是与语言、平台无关,因此.net可以访问java编写的WebService、java也可以访问.net编写的webservice,php、python等各种语言也几乎都支持webservice,因此可以说webservice可以实现跨语言方法调用。 但是如果自己构建请求、返回xml,解析xml请求,自己负责方法描述信息更新是很麻烦的,.net就提供了简化开发WebService。 WebService的创建和使用 下面以两个数的大小比较为例来说明在服务器端的创建和在客户端的调用方法: 1、? 服务器端(ServerWeb):就想写普通方法一样,不需要处理请求、响应。服务器端新建“Web服务”(asmx),在远端可以调用的方法上标注[WebMethod]。 Webadd.cs??????????????? ? 新建的web服务 ???????????????????????????????????????? 2、客户端添加对asmx的“服务器引用”,然后就可以调用***SoapClient类中的方法。就“好像”直接调用了服务端的方法。 添加服务引用的时候工具读取asmx的WSDL自动生成了ServiceReference1中的类,这些类帮我们来拼Http请求,并且把Http返回值拆成函数的返回。 客户端“添加服务引用”,填写asmx的地址。然后就可以调用Service References下自动生成的***SoapClient类了。 用WebService的时候如果服务端的接口定义发生变化,则需要重新添加对服务端的引用,因为Service References中的类是工具读取WSDL定义自动生成的。在服务引用上点击右键,选择“更新服务引用”。如果只是修改了WebService内部实现,而接口没变,则不需要“更新服务引用”,因为WSDL没变,Soap没变。 ??????? .Net remoting Net remoting 是简化网络通讯的技术,底层仍然是TCP等东西。 remoting要添加对System.Runtime.Remoting的引用 编写服务接口类库项目,正常写法!WebService中WSDL相当于对服务端方法的描述;.net Remoting中走的是二进制数据,因此必须一个描述服务端方法的接口类库。 服务端实现服务接口,继承自MarshalByRefObject,然后运行备注中的代码注册服务。 客户端代码在备注中 Remoting和WebService的区别:Remoting效率高,走的是普通TCP, WebService则是Http协议,需要IIS、ASP.Net、XML解析等,效率低。Remoting适合于内网通讯, WebService适合于外网通讯。 除非项目要求,否则以后尽量用WCF。.Net Remoting是微软私有协议,因此如果要跨平台调用还是普通Socket或者WebService。 用法说明: 1、新建接口项目,定义服务接口。 注意:remoting要添加对System.Runtime.Remoting的引用 2、新建服务器端项目(控制台的,或者WinForm,或者Windows服务等) 定义实现服务接口的类,还要继承继承自MarshalByRefObject类 服务器启动时调用 ??????????? //注册通道,通过TCP的9999端口对外提供服务 ??????????? TcpChannel tcpChannel = new TcpChannel(9999); ??????????? ChannelServices.RegisterChannel(tcpChannel); ??????????? //注册服务:第一个参数为服务的实现类,第二个参数为服务的名字。 ??????????? RemotingConfiguration.RegisterWellKnownServiceType(typeof(TestServiceImpl), ??????????????? "test",WellKnownObjectMode.Singleton); 注册服务。如果控制台程序,控制不要让程序退出, ??????????? //主要目的是不要让服务器退出 ??????????? while (true) ??????????? { ??????????????? string s = Console.ReadLine(); ??????????????? if (s == "quit") ??????????????? { ??????????????????? return; ??????????????? } ??????????? } 3、客户端:新建客户端项目,引用服务接口 ??????????? TcpChannel tcpChannel = new TcpChannel(); ??????????? ChannelServices.RegisterChannel(tcpChannel,false); ??????????? ITestService test = ??????????????? (ITestService)Activator.GetObject(typeof(ITestService),"tcp://127.0.0.1:9999/test");//第一个参数为服务实现的接口,第二个参数为服务的地址:最后一部分是服务在服务器端RegisterWellKnownServiceType时第二个参数的名字 然后就可以调用服务端方法了。
接口项目 ItestService.cs
客户端项目 服务器端项目 ???????????????????????????????????????????????????????????????????????????????????? WCF WCF(Windows Communication foundation)是微软的统一网络通讯开发的技术,无论底层用.Net Remoting还是WebService还是Restful还是MSMQ等,只要修改配置文件即可。所以WCF并不是新技术。 WCF和.Net Remoting、WebService等技术的关系就像ADO.Net和SQLServer、Oracle驱动的关系一样。通过VS的“WCF服务配置编辑器”简化配置,修改不同的协议。 一开始内网运行就行,后来想运行到公网,那么如果一开始用.net remoting写后来改成WebService还是有工作量的,因为写法不一样,但是用WCF就不一样了。 新建“WCF服务库”,WCF服务库可以Host在IIS上、单独的WinForm程序等。 WCF、.Net Remoting和WebService的关系: .Net Remoting是普通的TCP通讯,适合于局域网,效率高; WebService是基于Http协议,适合于广域网,效率低;WCF是对.Net Remoting、 WebService等的简化、统一,可以通过配置来切换不同的底层实现,代码几乎不用动。 ? ? 总结: WCF 支持多种通信协议 Http/Https 、TCP/UDP、MSMQ、命名管道、对等网、 消息可达性、事务流等。 WCF 可以与ASP.NET 集成、共享一个上下文(HttpContext)。 WCF 支持多种消息传输格式 :text,binary,mtom,Json 等。 WCF 安全性要强:支持对称安全、非对称安全、消息安全、传输安全、 SSL 流安全、Windows 流安全等。 WCF 支持多种会话模式:单向、双向、请求/响应。 WCF 支持REST 。 WCF 支持多种格式化方式。DataContractSerializer、XmlSerializer、 ? DataContractJsonSerializer 等。 WCF 支持 WAS hosting、Windows 服务 hosting、Self-Hosting、IIS hosting 等。 WCF 支持多种并发模式:单例、单调、会话 。 ? ? (1)WCF可以不依赖于IIS。 (2)WCF可以配置成BasicHttpBinding来兼容(或者说变身成)WS。 (3)WCF可以基于TCP或者MessegeQueue来传输数据。 (4)WCF的可配置性比WS强,比如安全性。 (5)WCF可以是有状态的,并支持事务。 ? 1:socket VS remoting ??? 使用socket无疑是效率最高的。但是,在复杂的接口环境下,socket的开发效率也是最低的。故在兼顾开发效率的情况下,可以使用remoting来代替socket开发。并且: 2:remoting vs webservice 3:remoting vs wcf ??? 与wcf的比较,更多的是从平台的普及度上来说。在当前环境下,2.0的普及度还是最高的。如果哪一天3.0甚至4.0普及了,当然WCF是最好的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |