和一个黑马程序员webservice通过web SERVICE进...

创建一个Windows Service应用程序-.NET教程,Web Service开发-虚拟主机资讯|虚拟主机动态
产品服务快速通道
----------------
==域名注册==
英文域名注册
中文域名注册
==网站推广==
==虚拟主机==
----------------
双线路虚拟主机
基本型虚拟主机
商用型虚拟主机
论坛型虚拟主机
功能型虚拟主机
Vip合租虚拟主机
虚拟主机性能对比
虚拟主机免费试用
机房速度测试
----------------
==租用托管==
服务器租用
----------------
==企业邮局==
购买企业邮局
----------------
==付款方式==
----------------
==联系我们==
您当前位置:->-> ->
创建一个Windows Service应用程序-.NET教程,Web Service开发
作者:网友供稿
  西部数码-全国虚拟主机10强!20余项管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:&
创建一个windows service应用程序
--------------------------------------------------------------------------------
下载本文代码
正是由于.net framework的出现,才使你能够构建出在系统重新启动时自动运行的、无人参与的(unattended)应用程序。
by stan schultes
技术工具箱:vb.net, xml, asp
windows service应用程序曾经是c++程序员专用的领域,除非你在vb中使用了第三方工具。现在它们则成为system.serviceprocess 命名空间下的.net framework类库中的主要部分,你可以随意使用任何.net语言来构建它。windows service是一种系统自动的、无人参与的程序(仅存在于windows nt、2000和xp操作系统中),它能够在系统启动时开始运行。你可以通过service control manager (scm) applet或者一些特殊的service-control应用(utility)来访问windows service。
我将讲解如何构建一个用于监控文件改变情况的windows service。filechangemonitor service用于随意地编写事务日志(event-log)条目以及当文件在一段时间内没有改变时发送e-mail。这种文件监控过程在用于确保需要时进行备份、正常运转报告生成器或按时间表将文件传送到远程系统上时是非常有用的。filechangemonitor service还能够发送显示程序正常运行的综合报告。
第一步是构建一个作为将来service项目起始点的windows service程序的模板。打开visual studio.net,用windows service模板来创建一个新的项目,将其命名为filechangemonitor(点此下载范例代码)。鼠标右键单击solution explorer(se)中的service1.vb文件并将其重新命名为changemonitor.vb。点击changemonitor 设计界面(你会看到“to add components to your class”消息),并将其在属性窗口(按f4显示的窗口)中的的名字和servicename属性均改为changemonitor。
同样将属性窗口中的canpauseandcontinue和canshutdown属性值设置为true。 这些属性控制着该service程序是否能够暂停/继续,以及在系统关闭时是否做出响应。你将在后面使用这些事件(以及stop事件)来保存你的service的“状态”――即给定时间内的执行文本(execution context )。
接下来,点击changemonitor 设计窗口中的“click here to switch to code view”链接。在代码窗口中,点击左边的加号来打开名为“component designer generated code”的区域。在sub main过程(routine)中,将servicestorun 赋值语句中的service1改为changemonitor: servicestorun = new system. _
&&&serviceprocess.servicebase() _
&&&{new changemonitor()}
右键单击在se中的filechangemonitor项目,选中属性,再从startupobject下拉列表中选择sub main。现在你就可以开始构建你的项目了(通过使用build | build solution菜单项)。
创建事件模板和过程
现在,在模板中加入一些事件过程(event-routine)的原型。你等一会儿可以将代码添加到这些service事件中去以便处理 windows service程序中的状态变化。在代码窗口中点击class name combo box(位于代码窗口上面左侧的combo box),然后选中(overrides)选项。在method name combo box中(位于代码窗口上面右侧的combo box),依次选中各项以便将过程原型(一个空程序)添加到代码窗口中,比如:oncontinue、onpause和onshutdown。你必须在每个过程中的method name combo box中重新选择(overrides)选项 。
接下来就开始构建过程模板。在你需要添加代码的changemonitor.vb中创建五个子过程原型: loadsettings()、savesettings()、runcheck()、runsummary()和startservice()。在这个类的最顶部imports system.serviceprocess语句的下面,通过使用imports语句来添加其他需要用到的命名空间:imports system.io
imports system.timers
imports system.web.mail
imports system.reflection
imports system.xml.serialization
由于你的service应用程序不是一个web项目,因此你可能需要手动将一个引用(reference)添加到web.mail命名空间下。右键单击se中的filechangemonitor项目,从弹出菜单中选择add reference。在 add reference对话框中选择列表中的system.web.dll条目,单击select按钮,然后点ok。
在changemonitor类的顶部、component designer区域的前面,添加一个用于文件检查功能的timer对象的声明: private withevents controltimer as timer
然后将下面三行代码加到onstart和oncontinue事件程序中: startservice()
runcheck()
runsummary()
当你的service启动时会触发onstart事件,而当暂停后继续运行时则会触发oncontinue事件。
在class name combo box中选择controltimer,并在method name combo box中选择elapsed。这样就会将controltimer_elapsed事件过程原型添加到项目中了。只需添加这两个run语句到controltimer_elapsed事件过程中,然后在onpause、onshutdown和onstop事件过程中添加代码来中断计时器(timer)并保存设置: controltimer.stop()
savesettings()
从这个简单的程序大纲中你可以看到用于windows service应用程序的文件检查功能的控制流程是如何运作的。当其中一个事件触发时,startservice函数便会加载设置,然后运行文件和简要检查。你可以在计时器时间到时运行检查程序;可以用stop或pause事件来中断计时器以及保存设置。
在startservice过程中添加代码来创建计时器,将时间间隔定为15秒(以毫秒值计),然后启动它:controltimer = new timer()
controltimer.interval = 15000
controltimer.autoreset = true
controltimer.start()
autoreset = true属性设定使计时器在时间到时继续运行。接下来,你可以在check函数运行时添加代码来编写windows application事务日志,这样你就可以看到service正在运行: private sub runcheck()
&&&eventlog.writeentry(servicename & _
&&&&&&& - check&, &checking files.&)
你可以通过windows中的event viewer(ev)应用程序来查看事件日志中的消息。
添加一个***程序(installer)
创建service应用程序模板的最后一项工作是在项目中添加一个***程序。在它运行之前你需要首先注册这个windows service程序。切换到changemonitor设计界面并打开属性窗口(如果看不到的话可以按f4),你可以看到在属性窗口下面有一个名为add installer的链接,点击该链接后会出现一个向导来引导你将一个名为projectinstaller的组件添加到当前项目中。这个向导在projectinstaller设计界面中放置了两个service控件:serviceprocessinstaller和serviceinstaller。
图1. 设置service属性
点击serviceprocessinstaller控件并对account属性进行设置。你可能希望选择localsystem(大多数service是运行在localsystem中的),但如果你喜欢,你还可以将它设置为一个用户帐户。点击serviceinstaller,将它的属性设置为displayname = filechangemonitor、 servicename = changemonitor以及starttype = automatic(如果你希望通过手动启动该service的话也可以将它设置为manual)。
通过build | build solution来构建你自己的项目,确保不存在什么错误。现在你就可以使用一个名为installutil的framework应用来***你的service了。打开命令行提示(command-prompt)窗口并执行corvars.bat文件来设置环境变量(你可以下载readme文件来了解详细内容)。使用cd(change directory)命令将其导航到你项目中的\bin目录下。执行以下命令来***你的service:& installutil filechangemonitor.exe
现在你可以使用control panel的administrative tools菜单(win2k 和winxp操作系统)中的scm applet来启动、停止、暂停以及继续运行你的filechangemonitor service了 (见图1)。当你启动这个service后就可以使用ev来查看application事务日志中由该service生成的事件了。点击f5刷新ev的显示,你会看到“check messages every 15 seconds”。你可以使用以下命令来卸载这个service(先用scm来终止service): & installutil filechangemonitor.exe /u
现在你可以保存该项目并将它作为以后service程序的一个模板。
service以某种状态运行(这可能是它未运行时保存的一组设定)。当service重新启动时,你可以加载它上次运行时的状态。一个简便的方法是使用.net framework中的序列化类(serialization class),如system.xml.serialization命名空间下的xml序列化(你也可以选择binary和soap序列化)。
用xml序列化保存设置
xml序列化是和用&serializable()&属性标记的类配合使用的。右键单击se中的filechangemonitor项目,从弹出的菜单中选择add | add class,将该类命名为cmonitor并点击 ok。在cmonitor中添加两个类――monitorheader和monitorfile: &serializable()& public class monitorheader
&&&public monitorintsecs as integer
&&&&other header properties&
&&&public files() as monitorfile
&serializable()& public class monitorfile
&&&public path as string
&&&&other file properties&
monitorheader包含控制service的设置,包括一组monitorfile对象。monitorfile对象中包含每个你想要检查进度的文件的监控设置。你可以将大多数类的属性当作public变量来实现,因为它们只用于你的service项目中。查看范例代码来了解该类的完整定义。你可以在changemonitor 类的模块中实现loadsettings和savesettings序列化过程(见列表1)。
在用于声明设置对象和存储设置文件路径的changemonitor类的顶部添加该类的私有变量:private m_monitorcontrol as new _
&&&monitorheader()
private m_ssettingspath as string
在调用startservice()之前将代码添加到onstart过程中,来完成在service启动之前对设置文件名进行检测。用reflection来找到应用程序的runtime .exe路径,并用substitute .xml作为文件的扩展名(这两个文件在同一目录下): m_ssettingspath = [assembly]. _
&&&getentryassembly.location. _
&&&replace(&.exe&, &.xml&)
在vb.net中assembly是一个关键字,因此在代码中你必须把它用一个方括号括起来。你需要整理startservice()过程以便从设置文件中加载计时器间隔: if m_monitorcontrol _
&&&.monitorintervalsecs & 0 then
&&&controltimer.interval = _
&&&&&&ctype(m_monitorcontrol _
&&&&&&.monitorintervalsecs * 1000, double)
&&&controltimer.autoreset = true
&&&controltimer.start()
现在,你可以实现主要的检查函数――runcheck了(见列表2)。runcheck负责调用runalarmaction并计算出files数组中每个文件的出现次数,该文件的nextcheck代表的是当前时间之前的时间并且自从上次检查以后就没有发生过改变。runalarmaction负责检查alarmaction标记、编写事务日志,然后通过sendemail过程来发送e-mail (见列表3)。
你可以采用类似的方法,基于monitorheader结构的汇总设置(summary setting)来实现runsummary和runsummaryaction方法,构建并测试你的windows service应用程序。范例代码中还包括一个名为filechgctl的service-control应用。它主要用于调试目的,可以将自定义命令(custom command)发送到filechangemonitor service中。自定义命令是一个范围在128到255之间的整数。当windows service应用程序中的oncustomcommand事件触发时你会得到自定义命令出现的通知。
你会发现service 应用程序在很多情况下是非常有用的,比如用在系统维护、监控以及其他自动的、无人照顾的操作中。windows service通常会通过事务日志来记录其活动情况,但正如我所介绍的,你的service也可以通过发送e-mail来方便地跟踪其进展情况。构建windows service应用程序的能力使你在用windows构建有效的商务方案方面得以轻松地扩展。
stan schultes 是florida州sarasota地区的一名web和企业应用程序的架构师和开发人员,以及vb开发领域的mcp。stan是vsm的一名特约编辑,定期为该杂志撰写文章。你可以访问stan的网站查看在线代码演示、更新资料以及其他信息。他的e-mail地址是。
文章整理:西部数码--专业提供、服务
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
文章页数:&
··········
··········
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
版权所有 西部数码()
CopyRight (c) 2002~ all right reserved.
公司地址:四川省成都市金牛区一环路北一段99号环球广场24楼 邮编:610031
***总机:028-08 38
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028- 财务QQ:
售前咨询QQ:2182518
售后服务QQ:webService详解(一)
什么是webService&
WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用.&&
1:从WebService的工作模式上理解的话,它跟普通的Web程序(比如ASP、JSP等)并没有本质的区别,都是基于HTTP传输协议的程序。&&
2:WebService所使用的数据均是基于XML格式的。目前标准的WebService在数据格式上主要采用SOAP协议。SOAP协议实际上就是一种基于XML编码规范的文本协议。&
webService的技术支持&
Web Service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,Web Service平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。目前这些协议有:&
  可扩展的标记语言XML 是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD 定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。&&
  Web Service平台是用XSD来作为数据类型系统的。当你用某种语言如VB. NET或C# 来构造一个Web Service时,为了符合Web Service标准,所有你使用的数据类型都必须被转换为XSD类型。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协议,如 SOAP。&
  SOAP即简单对象访问协议(Simple Object Access Protocal),它是用于交换XML编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。例如,你可以使用 SMTP,即因特网电子邮件协议来传递SOAP消息,这可是很有诱惑力的。在传输层之间的头是不同的,但XML有效负载保持相同。&&
  Web Service 希望实现不同的系统之间能够用&软件-软件对话&的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现&基于Web无缝集成&的目标。&
  Web Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。&
  UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。 调用RPC与消息传递&
  Web Service本身其实是在实现应用程序间的通信。我们现在有两种应用程序通信的方法:RPC远程过程调用 和消息传递。使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化一个远程对象并调用其方法和属性。RPC系统试图达到一种位置上的透明性:服务器暴露出远程对象的接口,而客户端就好像在本地使用的这些对象的接口一样,这样就隐藏了底层的信息,客户端也就根本不需要知道对象是在哪台机器上。&
如何发布一个WebService?&
1、用Jdk1.6.0_21以后的版本发布一个WebService服务.并通过地址栏查看它的wsdl文档.&
2、通过wsimport生成客户端代码,调用并查看运行的结果.(学会如何调用是我们的重点).&
需要注意的是,jdk1.6._07以后jdk版本发布WebService时必须要完整的对代码进行注解,如果使用的是jdk1.6.0_21以后版本,因为它已经内含了ws2.1所以,可以只对类添加@WebService的注解.&
以下是两段不同的代码:&
在jdk1.6.0_13的版本上发布的ws:&
package com.&
import javax.jws.WebM&
import javax.jws.WebS&
import javax.jws.soap.SOAPB&
import javax.jws.soap.SOAPBinding.S&
import javax.xml.ws.E&
@WebService(targetNamespace=&&)&
@SOAPBinding(style=Style.RPC)//只支持RPC的消息风格&
public class HelloWorld {&
//以下通过@WebMethod注解,对外公开方法&
@WebMethod&
public String sayHello(){&
return &HelloWorld&;&
public static void main(String[] args) {&
Endpoint.publish(& HelloWorld());&
2:以下是在jdk1.6.0_24上发布的WebService代码:&
package com.&
import javax.jws.WebS&
import javax.xml.ws.E&
@WebService//注意只有此一个注解,此注解也是必须的,默认的SOAP消息风格为:DOCUMENT&
public class HelloWorld {&
public String sayHello(){&
return &HelloWorld&;&
public static void main(String[] args) {&
Endpoint.publish(& HelloWorld());&
第一个WebService服务&
package com.&
import javax.jws.WebS&
import javax.xml.ws.E&
&* 第一个WebService服务应用&
//通过注解,标明此类发布为一个WebService&
@WebService&
public class HelloWorld {&
public String sayHello(){&
return &Hello World&;&
//在main方法中,使用javax.xml.ws.Endpoint端点发布一个应用&
public static void main(String[] args) {&
Endpoint.publish(&&,&
&new HelloWorld());&
代码说明:HelloWorld类的所有非静态公开方法将对外部暴露.&
Wsimport工具说明:&
&& wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么写的并不重要.&
&& wsimport.exe位于J***A_HOME\bin目录下.&
&& 常用参数为:&
&&& -d&目录&& - 将生成.class文件。默认参数。&
&&& -s&目录& - 将生成.java文件。&
&&& -p&生成的新包名& -将生成的类,放于指定的包下。&
(wsdlurl) - ,必须的参数&
1:可以通过java &version检查你当前的版本号.如果版本太低可以***高版本的jdk.&
或直接将别人已***好的jdk目录拷贝到你的机器如D:\jdk1.6.0_24目录下.&
因为以前的环境变量已经设置成以前老版本的jdk目录,即J***A_HOME和PATH两个环境变量.&
可以再重新设置一下环境变量为:J***A_HOME=D:\jdk1.6.0_24,path=%J***A_HOME%\bin,&
重新设置了环境变量后,要重新打开一个doc(命令行)窗口.才生效.&
如果不想修改原来已经配置好的环境变量,可以命令行窗口输入以下命令,使jdk1.6.0_24生效:&
set path = D:\jdk1.6.0_24\%PATH%(回车即可)&
再通过java &version查看jdk的版本号是否已经发生变化.&
2:转到一个相对干净的目录下,我在d盘上新建立一个目录名为:ws,并转到此目录下.&
3:开启你的webService.&
4:输入以下命令:&
& wsimport &s . &
&& 参数说明:-s是指编译出源代码文件,后面的.(点)指將代碼放到當前目錄下.&
&& 最后面的http&.是指获取wsdl说明书的地址.&
5:此时,将生成.java文件和.class文件.(都包含原始包名).将代码Copy到你的项目中.(只拷贝java文件)&
6:在新的项目中,新一个类,(可位于任意包下),对上面生成的代码进行调用,见下一页ppt.&
7:wsimport其他参数说明,我们经常使用的参数为-d,-s,-p&
-d&目录&将会生成.class文件.&
示例:wsimport &d . &
-s&目录&将会生成.java文件.&
示例:wsimport &s . &
-p&包名&将生成的文件(.java或是.class修改成指定的包名)&
示例:wsimport -s . -p com.beijing.itcast &
对于-p参数,注意包名的修改,它将所生成类,全部置于通过-p指定的包下.(演示)&
需要说明的是,当仅使用-p参数时,它也将同时使用-d即编译成.class文件. &d参数写或不写,它都在那里,不离不弃.&
RunMain.java的源代码如下:&
package com.&
import com.itcast.HelloW&
import com.itcast.HelloWorldS&
&* 通过调用生成的类,来调用远程代码&
public class RunMain {&
public static void main(String[] args) {&
//从HelloWorldSerice的getHelloWorldPort方法中返回调用接口&
HelloWorld helloWorld =&&
new HelloWorldService().getHelloWorldPort();&
String str = helloWorld.sayHello(); //执行调用&
System.err.println(str);//返回HelloWorld字符串&
WebService与普通Web程序的区别&
1、& WebService只采用HTTP POST方式传输数据,不使用GET方式;&&
1)& Tttp post的contentType为&
(1)application/x-www-form-urlencoded&
2)& WebService的contentType为&
(2) Text/xml soap1.1&
(3) application/soap+xml &soap1.2&
2、WebService从数据传输格式上作了限定。WebService所使用的数据均是基于XML格式的。目前标准的WebService在数据格式上主要采用SOAP协议。SOAP协议实际上就是一种基于XML编码规范的文本协议。&
WebService和web服务器的区别:&
我们可以把WebService看作是Web服务器上应用;反过来说,Web服务器是WebService运行时所必需的容器。这就是它们的区别和联系。&
WebService的特点:&
1、& WebService通过HTTP POST方式接受客户的请求&
2、& WebService与客户端之间一般使用SOAP协议传输XML数据.&
3、它本身就是为了跨平台或跨语言而设计的。&&
摘自 w_l_j
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'195810人阅读
Webservice(2)
&&大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊、书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分。但是不得不承认的是WebService真的是一门新兴和有前途的技术,那么WebService到底是什么?何时应该用?
&&&当前的应用程序开发逐步的呈现了两种迥然不同的倾向:一种是基于浏览器的瘦客户端应用程序,一种是基于浏览器的富客户端应用程序(RIA),当然后一种技术相对来说更加的时髦一些(如现在很流行的Html5技术),这里主要讲前者。
&&&基于浏览器的瘦客户端应用程序并不是因为瘦客户能够提供更好的用户界面,而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因为应用程序***和配置的问题,另一半是因为客户和服务器之间通信的问题。传统的Windows富客户应用程序使用DCOM来与服务器进行通信和调用远程对象。配置好DCOM使其在一个大型的网络中正常工作将是一个极富挑战性的工作,同时也是许多IT工程师的噩梦。事实上,许多IT工程师宁愿忍受浏览器所带来的功能限制,也不愿在局域网上去运行一个DCOM。关于客户端与服务器的通信问题,一个完美的解决方法是使用HTTP协议来通信。这是因为任何运行Web浏览器的机器都在使用HTTP协议。同时,当前许多防火墙也配置为只允许HTTP连接。许多商用程序还面临另一个问题,那就是与其他程序的互操作性。如果所有的应用程序都是使用COM或.NET语言写的,并且都运行在Windows平台上,那就天下太平了。然而,事实上大多数商业数据仍然在大型主机上以非关系文件(VSAM)的形式存放,并由COBOL语言编写的大型机程序访问。而且,目前还有很多商用程序继续在使用C++、Java、Visual&Basic和其他各种各样的语言编写。现在,除了最简单的程序之外,所有的应用程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。这样的任务通常都是由特殊的方法,如文件传输和分析,消息队列,还有仅适用于某些情况的的API,如IBM的高级程序到程序交流(APPC)等来完成的。在以前,没有一个应用程序通信标准,是独立于平台、组建模型和编程语言的。只有通过Web&Service,客户端和服务器才能够自由的用HTTP进行通信,不论两个程序的平台和编程语言是什么。
二、WebService到底是什么?
&&&一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
&&&所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。
&&&&所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统,商场的POS机转账调用的转账方法的代码其实是跑在银行服务器上。再比如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的SOA应用。
&&&其实可以从多个角度来理解WebService,从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web&service&,只要我们可以通过Web&service标准对这些服务进行查询和访问。&
&& WebService平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web&service平台必须提供一种标准来描述Web&service,让客户可以得到足够的信息来调用这个Web&service。最后,我们还必须有一种方法来对这个Web&service进行远程调用,这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。
三、WebService平台技术
&&XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。
XML+XSD:
& WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。&
& XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,64位?这些细节对实现互操作性很重要。XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web&service时,为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。
&& WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。
&&SOAP协议 = HTTP协议 + XML数据格式
& SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。打个比喻:HTTP就是普通公路,XML就是中间的绿色隔离带和两边的防护栏,SOAP就是普通公路经过加隔离带和防护栏改造过的高速公路。
&& 好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。
&& WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web&Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web&service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。
&&WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。
四、WebService开发
&&WebService开发可以分为服务器端开发和客户端开发两个方面:
&&&服务端开发:把公司内部系统的业务方法发布成WebService服务,供远程合作单位和个人调用。(借助一些WebService框&& 架可以很轻松地把自己的业务对象发布成WebService服务,Java方面的典型WebService框架包括:axis,xfire,cxf等,java
ee服务器通常也支持发布WebService服务,例如JBoss。)
&&&客户端开发:调用别人发布的WebService服务,大多数人从事的开发都属于这个方面,例如,调用天气预报WebService服务。(使用厂商的WSDL2Java之类的工具生成静态调用的代理类代码;使用厂商提供的客户端编程API类;使用SUN公司早期标准的jax-rpc开发包;使用SUN公司最新标准的jax-ws开发包。当然SUN已被ORACLE收购)
&&&WebService的工作调用原理:对客户端而言,我们给这各类WebService客户端API传递wsdl文件的url地址,这些API就会创建出底层的代理类,我调用这些代理,就可以访问到webservice服务。代理类把客户端的方法调用变成soap格式的请求数据再通过HTTP协议发出去,并把接收到的soap数据变成返回值返回。对服务端而言,各类WebService框架的本质就是一个大大的Servlet,当远程调用客户端给它通过http协议发送过来soap格式的请求数据时,它分析这个数据,就知道要调用哪个java类的哪个方法,于是去查找或创建这个对象,并调用其方法,再把方法返回的结果包装成soap格式的数据,通过http响应消息回给客户端。
五、适用场合
1、跨防火墙通信:
&& 如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服务器。在这种情况下,使用DCOM就不是那么简单,通常也不便于把客户端程序发布到数量如此庞大的每一个用户手中。传统的做法是,选择用浏览器作为客户端,写下一大堆ASP页面,把应用程序的中间层暴露给最终用户。这样做的结果是开发难度大,程序很难维护。如果中间层组件换成WebService的话,就可以从用户界面直接调用中间层组件。从大多数人的经验来看,在一个用户界面和中间层有较多交互的应用程序中,使用WebService这种结构,可以节省花在用户界面编程上20%的开发时间。
2、应用程序集成:
&& 企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量。应用程序经常需要从运行在IBM主机上的程序中获取数据;或者把数据发送到主机或UNIX应用程序中去。即使在同一个平台上,不同软件厂商生产的各种软件也常常需要集成起来。通过WebService,可以很容易的集成不同结构的应用程序。
3、B2B集成:
&& 用WebService集成应用程序,可以使公司内部的商务处理更加自动化。但当交易跨越供应商和客户、突破公司的界限时会怎么样呢?跨公司的商务交易集成通常叫做B2B集成。WebService是B2B集成成功的关键。通过WebService,公司可以把关键的商务应用“暴露”给指定的供应商和客户。例如,把电子下单系统和电子***系统“暴露”出来,客户就可以以电子的方式发送订单,供应商则可以以电子的方式发送原料采购***。当然,这并不是一个新的概念,EDI(电子文档交换)早就是这样了。但是,WebService的实现要比EDI简单得多,而且WebService运行在Internet上,在世界任何地方都可轻易实现,其运行成本就相对较低。不过,WebService并不像EDI那样,是文档交换或B2B集成的完整解决方案。WebService只是B2B集成的一个关键部分,还需要许多其它的部分才能实现集成。
&& 用WebService来实现B2B集成的最大好处在于可以轻易实现互操作性。只要把商务逻辑“暴露”出来,成为WebService,就可以让任何指定的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么开发语言。这样就大大减少了花在B2B集成上的时间和成本,让许多原本无法承受EDI的中小企业也能实现B2B集成。
4、软件和数据重用:&&&&
&&&&& 软件重用是一个很大的主题,重用的形式很多,重用的程度有大有小。最基本的形式是源代码模块或者类一级的重用,一种形式是二进制形式的组件重用。采用WebService应用程序可以用标准的方法把功能和数据“暴露”出来,供其它应用程序使用,达到业务级重用。
六、不适用场合
1、单机应用程序:
&&&&& 目前,企业和个人还使用着很多桌面应用程序。其中一些只需要与本机上的其它程序通信。在这种情况下,最好就不要用WebService,只要用本地的 API就可以了。COM非常适合于在这种情况下工作,因为它既小又快。运行在同一台服务器上的服务器软件也是这样。最好直接用COM或其它本地的API来进行应用程序间的调用。当然WebService也能用在这些场合,但那样不仅消耗太大,而且不会带来任何好处。
2、局域网的同构应用程序:
&&&&& 在许多应用中,所有的程序都是用VB或VC开发的,都在Windows平台下使用COM,都运行在同一个局域网上。例如,有两个服务器应用程序需要相互通信,或者有一个Win32或WinForm的客户程序要连接局域网上另一个服务器的程序。在这些程序里,使用DCOM会比SOAP/HTTP有效得多。与此相类似,如果一个.NET程序要连接到局域网上的另一个.NET程序,应该使用.NETremoting。有趣的是,在.NETremoting 中,也可以指定使用SOAP/HTTP来进行WebService调用。不过最好还是直接通过TCP进行RPC调用,那样会有效得多。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:373802次
积分:1849
积分:1849
排名:第15890名
原创:28篇
转载:15篇
评论:122条
(6)(10)(9)(8)(6)(4)

参考资料

 

随机推荐