webservice的工作原?/span>
实际上,WebService的主要目标是跨^台的可互操作性。ؓ了达到这一目标Q?/span>WebService完全ZXMLQ可扩展标记语言Q?/span>XSDQ?/span>XMLSchemaQ等独立于^台、独立于软g供应商的标准Q是创徏可互操作的、分布式应用E序的新q_。由此可以看出,在以下四U情况下Q?/span>WebService会带来极大的好处?/span>
优势一Q跨防火墙的通信
如果应用E序有成千上万的用户Q而且分布在世界各圎ͼ那么客户端和服务器之间的通信是一个棘手的问题。因为客L和服务器之间通常会有防火墙或者代理服务器。在q种情况下,使用DCOM׃是那么简单,通常也不便于把客LE序发布到数量如此庞大的每一个用h中。传l的做法是,选择用浏览器作ؓ客户端,写下一大堆ASP面Q把应用E序的中间层暴露l最l用戗这样做的结果是开发难度大Q程序很隄护?/span>
举个例子Q在应用E序里加入一个新面Q必d建立好用L?/span>(Web面)Qƈ在这个页面后面,包含相应商业逻辑的中间层lgQ还要再建立臛_一?/span>ASP面Q用来接受用戯入的信息Q调用中间层lgQ把l果格式化ؓHTML形式Q最后还要把“l果?#8221;送回览器。要是客L代码不再如此依赖?/span>HTML表单Q客L的编E就单多了?/span>
如果中间层组件换?/span>WebService的话Q就可以从用L面直接调用中间层lgQ从而省掉徏?/span>ASP面的那一步。要调用WebServiceQ可以直接?/span>MicrosoftSOAPToolkit?/span>.NETq样?/span>SOAP客户端,也可以用自己开发的SOAP客户端,然后把它和应用程序连接v来。不仅羃短了开发周期,q减了代码复杂度,q能够增强应用程序的可维护性。同Ӟ应用E序也不再需要在每次调用中间层组件时Q都跌{到相应的“l果?#8221;?/span>
从经验来看,在一个用L面和中间层有较多交互的应用程序中Q?/span>WebServiceq种l构Q可以节省花在用L面编E上20%的开发时间。另外,q样一个由WebServicel成的中间层Q完全可以在应用E序集成或其它场合下重用。最后,通过WebService把应用程序的逻辑和数?#8220;暴露”出来Q还可以让其它^C的客户重用这些应用程序?/span>
优势二:应用E序集成
允许在不同^C、以不同语言~写的各U程序以Z标准的方式相互通信。企业的应用程序开发者都知道Q企业里l常都要把用不同语言写成的、在不同q_上运行的各种E序集成hQ而这U集成将p很大的开发力量。应用程序经帔R要从q行?/span>IBML上的E序中获取数据;或者把数据发送到L?/span>UNIX应用E序中去。即使在同一个^CQ不同Y件厂商生产的各种软g也常帔R要集成v来。通过WebServiceQ应用程序可以用标准的方法把功能和数?#8220;暴露”出来Q供其它应用E序使用?/span>
例如Q有一个订单记录程序,用于从客戯得新订单Q包括客户信息、发货地址、数量、h格和付款方式{内容;q有一个订单执行程序,用于实际货物发送的理。这两个E序来自不同软g厂商。一份新订单q来之后Q订单记录程序需要通知订单执行E序发送货物。通过在订单执行程序上面增加一?/span>WebServiceQ订单执行程序可以把“AddOrder”函数“暴露”出来。这P每当有新订单到来Ӟ订单dE序可以调用这个函数来发送货物了?/span>
优势三:B2B的集?/span>
?/span>WebService集成应用E序Q可以公司内部的商务处理更加自动化。但当交易跨供应商和客戗突破公司的界限时会怎么样呢Q跨公司的商务交易集成通常叫做B2B集成?/span>
WebService?/span>B2B集成成功的关键。通过WebServiceQ公司可以把关键的商务应?#8220;暴露”l指定的供应商和客户。例如,把电子下单系l和电子发票pȝ“暴露”出来Q客户就可以以电子的方式发送订单,供应商则可以以电子的方式发送原料采购发。当Ӟqƈ不是一个新的概念,EDI(电子文档交换)早就是这样了。但是,WebService的实现要?/span>EDI单得多,而且WebServiceq行?/span>Internet上,在世界Q何地斚w可轻易实玎ͼ其运行成本就相对较低。不q,WebServiceq不?/span>EDI那样Q是文档交换?/span>B2B集成的完整解x案?/span>WebService只是B2B集成的一个关键部分,q需要许多其它的部分才能实现集成?/span>
?/span>WebService来实?/span>B2B集成的最大好处在于可以轻易实C操作性。只要把商务逻辑“暴露”出来Q成?/span>WebServiceQ就可以让Q何指定的合作伙伴调用q些商务逻辑Q而不他们的pȝ在什么^Cq行Q用什么开发语a。这样就大大减少了花?/span>B2B集成上的旉和成本,让许多原本无法承?/span>EDI的中企业也能实?/span>B2B集成?/span>
优势四:软g和数据重?/font>
软g重用是一个很大的主题Q重用的形式很多Q重用的E度有大有小。最基本的Ş式是源代码模块或者类一U的重用Q另一UŞ式是二进制Ş式的lg重用?/font>
?/span>WebService集成各种应用中的功能Qؓ用户提供一个统一的界?/span>
当前Q像表格控g或用L面控件这L可重用Y件组Ӟ在市Z都占有很大的份额。但q类软g的重用有一个很大的限制Q就是重用仅限于代码Q数据不能重用。原因在于,发布lg甚至源代码都比较ҎQ但要发布数据就没那么容易,除非是不会经常变化的静态数据?/font>
WebService在允讔R用代码的同时Q可以重用代码背后的数据。?/span>WebServiceQ再也不必像以前那样Q要先从W三方购买、安装Y件组Ӟ再从应用E序中调用这些组Ӟ只需要直接调用远端的WebService可以了。D个例子,要在应用E序中确认用戯入的地址Q只需把这个地址直接发送给相应?/span>WebServiceQ这?/span>WebService׃帮你查阅街道地址、城市、省区和邮政~码{信息,认q个地址是否在相应的邮政~码区域?/span>WebService的提供商可以按时间或使用ơ数来对q项服务q行收费。这L服务要通过lg重用来实现是不可能的Q那L话你必须下蝲q安装好包含街道地址、城市、省区和邮政~码{信息的数据库,而且q个数据库还是不能实时更新的?/span>
另一UY仉用的情况是,把好几个应用E序的功能集成v来。例如,要徏立一个局域网上的门户站点应用Q让用户既可以查询联邦快递包裹,查看股市行情Q又可以理自己的日E安排,q可以在U购买电q。现?/span>Web上有很多应用E序供应商,都在其应用中实现了这些功能。一旦他们把q些功能都通过WebService“暴露”出来Q就可以非常Ҏ地把所有这些功能都集成C的门L点中Qؓ用户提供一个统一的、友好的界面?/span>
来Q许多应用程序都会利?/span>WebServiceQ把当前Zlg的应用程序结构扩展ؓlg/WebService的合结构,可以在应用程序中使用W三方的WebService提供的功能,也可以把自己的应用程序功能通过WebService提供l别人。两U情况下Q都可以重用代码和代码背后的数据?/span>
从以上论q可以看出,WebService在通过Webq行互操作或q程调用的时候是最有用的。不q,也有一些情况,WebServiceҎ不能带来M好处?/span>
短处一Q单机应用程?/font>
目前Q企业和个hq用着很多桌面应用E序。其中一些只需要与本机上的其它E序通信。在q种情况下,最好就不要?/span>WebServiceQ只要用本地?/span>API可以了?/span>COM非常适合于在q种情况下工作,因ؓ它既又快。运行在同一台服务器上的服务器Y件也是这栗最好直接用COM或其它本地的API来进行应用程序间的调用。当?/span>WebService也能用在q些场合Q但那样不仅消耗太大,而且不会带来M好处?/span>
短处二:局域网的同构应用程?/font>
在许多应用中Q所有的E序都是?/span>VB?/span>VC开发的Q都?/span>Windowsq_下?/span>COMQ都q行在同一个局域网上。例如,有两个服务器应用E序需要相互通信Q或者有一?/span>Win32?/span>WinForm的客L序要q接局域网上另一个服务器的程序。在q些E序里,使用DCOM会比SOAP/HTTP有效得多。与此相cMQ如果一?/span>.NETE序要连接到局域网上的另一?/span>.NETE序Q应该?/span>.NETremoting。有的是,?/span>.NETremoting中,也可以指定?/span>SOAP/HTTP来进?/span>WebService调用。不q最好还是直接通过TCPq行RPC调用Q那样会有效得多?/span>
MQ只要从应用E序l构的角度看Q有别的Ҏ?/span>WebService更有效、更可行Q那׃要用WebService?/span>
?/span>Web Service定义为:通过 SOAP ?/span> Web上提供的软g服务Q?/span> WSDL 文gq行说明Qƈ通过 UDDI q行注册?/span>
Web Service架构Q?/span>Web Service是独立的、模块化的应用,能够通过因特|来描述、发布、定位以及调用。在Web Service的体pL构中包括三个角色Q服务提供?/span>(Service Provider)、服务请求?/span>(Service Requestor)、服务注册器(Service Registry)。角色间主要有三个操作:发布(Publish)、查?/span>(Find)、绑?/span>(Bind)?/span>
下图清楚的描qC三种角色Q以及角色之间的作用关系?/font>
Web Service协议标准
1、简单对象访问协议(SOAPQ?/span>
SOAP?/span>Simple Object Access Protocol的羃写,是一U基?/span>XML的不依赖传输协议的表C层协议Q用来在分散或分布式的应用程序之间方便地以对象的形式交换数据。在SOAP的下层,可以?/span>HTTPQ也可以?/span>SMTP/POP3Q还可以是ؓ一些应用而专门设计的Ҏ的通信协议?/span>
SOAP包括三个主要部分Q?/span>
SOAP装l构Q定义了一个整体框Ӟ以表C消息中包含什么内容,谁来处理q些内容以及q些内容是可选的或是必需的?/span>
SOAP~码规则Q定义了用以交换应用E序定义的数据类型的实例的一pd机制?/span>
SOAP RPC表示Q定义了一个用来表CE过E调用和应答的协定?/span>
2?/span>Web Service描述语言Q?/span>WSDLQ?/span>
WSDL?/span>Web Service Description Language的羃写,该语a网l服务定义成一个能交换消息的通信端点集,为分布式pȝ提供了帮助文档,同时也可作ؓ自动实现应用间通信的解x案?/span>
3、统一描述、发现和集成协议Q?/span>UDDIQ?/span>
UDDI是一套基?/span>Web的、分布式的、ؓWeb Service提供的、信息注册中心的实现标准规范Q同时也包含一l企业能将自n提供?/span>Web Service注册Q以使别的企业能够发现的讉K协议的实现标准?/span>
通过xfire实现?/span>webservice。下面详l介l一?/span>xfire?/span>
XFire是一个免费的,开源的SOAP框架. 它不仅允怽L?/span>地实现这么一个环?/span>.而且q提供了很多先进的特?/span>.如果你的Web应用有一?/span>Javac?/span>, 现在你希望这个类变成Web服务,?/span>XFire完成q一工作你不必写一句代?/span>.仅需操作一下部|描q器,你就会得C?/span>Web服务.
一?/font>建立接口文gcom.resoft.recis.ws.ReCISService
public interface ReCISService {
//hpȝ讄信息
public AppInfo getAppInfo();
}
public class ReCISServiceImp implements ReCISService {
public com.resoft.recis.ws.AppInfo getAppInfo() {
// TODO Auto-generated method stub
return com.resoft.recis.ws.AppInfo.getAppInfo();
}
}
二?/font>已存在类com.resoft.recis.ws. AppInfo
public class AppInfo {
double cardLeft;
/** default constructor */
public AppInfo() {
}
public double getCardLeft() {
return cardLeft;
}
public void setCardLeft(double cardLeft) {
this.cardLeft = cardLeft;
}
public static AppInfo getAppInfo() {
Session session = HibernateUtil.getSession();
com.resoft.recis.biz.AppInfo dbappinfo = (com.resoft.recis.biz.AppInfo) Util
.getHQLResult(session, "from AppInfo");
if (dbappinfo == null) {
return null;
}
com.resoft.recis.ws.AppInfo appinfo = new com.resoft.recis.ws.AppInfo();
appinfo.setOperid("");
appinfo.setOrgcode("");
appinfo.setCardHeight(dbappinfo.getCardHeight());
appinfo.setCardLeft(dbappinfo.getCardLeft());
appinfo.setCardTop(dbappinfo.getCardTop());
appinfo.setCardWidth(dbappinfo.getCardWidth());
HibernateUtil.closeSession();
return appinfo;
}
}
三?/span>Web.xml应用的部|描q?/span>
<!?span> xfire?/span>servlet配置文g -->
<servlet>
<servlet-name>XFireServlet</servlet-name>
<display-name>XFire Servlet</display-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
四?/font>创徏services.xml文g
XFire本n是ZServlet的应?/span>,xfire使用services.xml文g来完?/span>Web服务配置?/span>q个文g位于src/META-INF/xfire目录?/span>,
src\META-INF\xfire
下面是基本的配置条目Q?/span>q个配置文g中配|了xfire的接口,实现与验印控件的交互?/span>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>ReCISService</name>
<namespace>http://resoft</namespace>
<serviceClass>com.resoft.recis.ws.ReCISService</serviceClass> <implementationClass>com.resoft.recis.ws.ReCISServiceImp</implementat ionClass>
</service>
</beans>
services.xml文g中的具体内容如下Q?/span>
<service>元素Q?/span>
?/span>Web服务的定义包含在<service>元素内?/span><service>元素下还有若q子元素?/span>
<name>子元素:
可以提供M有效?/span>xml名字,q个名字会被客户端程序和服务器上的其他组件?/span>.例如,当服务器h以后,你可以在览器上使用q个名称来查?/span>WSDL.
<namespace>子元素:
M有效?/span>xml名称都可?/span>, <namespace>作Z服务器的唯一标识变量使用.
<serviceClass>子元素:
包含Javacd用来指明Ҏ的签?/span>.在这个例子中?/span>ReCISService接口.如果JavacL有实CQ何接?/span>,那就填入cd.只需要这一个入口来他们{换成Web服务.
<implementationClass>子元素:
记录实现接口?/span>Javacd.q是一个可选元?/span>.如果前一个元?/span><serviceClass>填入的是接口,那么此处p填入相应的实现类?/span>.
五?/span>XFire和所有必要的库文?/span>
讉KXFire官方|站http://xfire.codehaus.org/ 下蝲xfire-distribution-
xfire-all-
?nbsp;activation-1.1.jar
commons-codec-1.3.jar
commons-httpclient-3.0.jar
commons-logging-
mail-1.4.jar
jaxen-1.1-beta-9.jar
jdom-1.0.jar
junit-
servlet-api-2.3.jar
spring-
stax-api-
wsdl4j-
wstx-asl-
xbean-
xbean-spring-2.8.jar
XmlSchema-1.1.jar
xfire-jsr181-api-1.0-M1.jar
六?/span>通过URL验证Web服务有效?/span>
首先,我们先来看看WSDL是否有效。在览器中输入URL地址?/span>http://127.0.0.1/test/services/ReCISService?wsdl 注意URL?/span>IP地址和端口号是否需要修攏V?/span>如果输入了有效的URL,会看到?/span><wsdl:definitions>为根l点?/span>xml文g。这个文件叫?/span>web服务?/span>WSDL.如果你看Cq个文gQ那么初步验证你?/span>Web服务有效?/span>
但是q个验证q不够。有时候情况会复杂一些,你可以看?/span>WSDLQ但是客L却无法访?/span>Web服务。因此要真正?/span>Web服务是否真的好Q就要用客户端程序对Web服务作一ơ真正的调用?/span>
七?/span>客户端验?/span>Web服务有效?/span>
建立下面试cL?/span>Web服务器的有效性?/span>
public class TestWebservice
{
public static void main(String args[])
{
String serviceURL ="http://127.0.0.1/test/services/ReCISService";
Service serviceModel = new ObjectServiceFactory().create(ReCISService.class,null,"http://resoft",null);
XFireProxyFactory serviceFactory = new XFireProxyFactory();
try
{
ReCISService service = (ReCISService) serviceFactory.create(serviceModel, serviceURL);
Client client = Client.getInstance(service);
System.out.println("begin");
com.resoft.recis.ws.AppInfo ai=service.getAppInfo();
System.out.println(ai.getCardHeight());
System.out.println("end");
}
catch (MalformedURLException e)
{
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Web service到底是什么;在什么情况下你应该用Web service?
分布式应用程序和览?
研究一下当前的应用E序开发,你会发现一个绝对的們Qh们开始偏爱基于浏览器的瘦客户应用E序。这当然不是因ؓ瘦客戯够提供更好的用户界面Q而是因ؓ它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因ؓ应用E序安装和配|的问题Q另一半是因ؓ客户和服务器之间通信的问题?
传统的Windows富客户应用程序用DCOM来与服务器进行通信和调用远E对象。配|好DCOM使其在一个大型的|络中正常工作将是一个极富挑战性的工作Q同时也是许多IT工程师的噩梦。事实上Q许多IT工程师宁愿忍受浏览器所带来的功能限Ӟ也不愿在局域网上去q行一个DCOM。在我看来,l果是一个发布容易,但开发难度大而且用户界面极其受限的应用程序。极端的_是你花了更多的资金和时_却开发出从用L来功能更q应用E序。不信?问问你的会计师对新的Z览器的会计软g有什么想法:l大多数商用E序用户希望使用更加友好的Windows用户界面?
关于客户端与服务器的通信问题Q一个完的解决Ҏ是用HTTP协议来通信。这是因ZQ何运行Web览器的机器都在使用HTTP协议。同Ӟ当前许多防火墙也配置为只允许HTTPq接?
许多商用E序q面临另一个问题,那就是与其他E序的互操作性。如果所有的应用E序都是使用COM?NET语言写的Qƈ且都q行在Windowsq_上,那就天下太^了。然而,事实上大多数商业数据仍然在大型主Z以非关系文g(VSAM)的Ş式存放,q由COBOL语言~写的大型机E序讉K。而且Q目前还有很多商用程序l在使用C++、Java、Visual Basic和其他各U各L语言~写。现在,除了最单的E序之外Q所有的应用E序都需要与q行在其他异构^C的应用程序集成ƈq行数据交换。这Ld通常都是qD的ҎQ如文g传输和分析,消息队列Q还有仅适用于某些情늚的APIQ如IBM?高E序到程序交?APPC)"{来完成的。在以前Q没有一个应用程序通信标准Q是独立于^台、组建模型和~程语言的。只有通过Web ServiceQ客L和服务器才能够自q用HTTPq行通信Q不Z个程序的q_和编E语a是什么?
什么是Web Service
对这个问题,我们臛_有两U答案。从表面上看QWeb service 是一个应用程序,它向外界暴露Z个能够通过Webq行调用的API。这是_你能够用~程的方法通过Web来调用这个应用程序。我们把调用q个Web service 的应用程序叫做客戗例如,你想创徏一个Web service Q它的作用是q回当前的天气情c那么你可已建立一个ASP面Q它接受邮政~码作ؓ查询字符Ԍ然后q回一个由逗号隔开的字W串Q包含了当前的气温和天气。要调用q个ASP面Q客L需要发送下面的q个HTTP GEThQ?
http://host.company.com/weather.asp?zipcode=20171
q回的数据就应该是这P
21,?
q个ASP面应该可以算作是Web service 了。因为它ZHTTP GEThQ暴露出了一个可以通过Web调用的API。当ӞWeb service q有更多的东ѝ?
下面是对Web service 更精的解释Q?Web services是徏立可互操作的分布式应用程序的新^台。作Z个WindowsE序员,你可能已l用COM或DCOM建立q基于组件的分布式应用程序。COM是一个非常好的组件技术,但是我们也很Ҏ丑ևCOMq不能满求的情况?
Web serviceq_是一套标准,它定义了应用E序如何在Web上实C操作性。你可以用Q何你喜欢的语aQ在M你喜Ƣ的q_上写Web service Q只要我们可以通过Web service标准对这些服务进行查询和讉K?
新^?
Web serviceq_需要一套协议来实现分布式应用程序的创徏。Q何^台都有它的数据表C方法和cdpȝ。要实现互操作性,Web serviceq_必须提供一套标准的cdpȝQ用于沟通不同^台、编E语a和组件模型中的不同类型系l。在传统的分布式pȝ中,Z界面(interface)的^台提供了一些方法来描述界面、方法和参数Q译注:如COM和COBAR中的IDL语言Q。同LQWeb serviceq_也必L供一U标准来描述Web serviceQ让客户可以得到_的信息来调用q个Web service。最后,我们q必L一U方法来对这个Web serviceq行q程调用。这U方法实际是一U远E过E调用协?RPC)。ؓ了达C操作性,q种RPC协议q必Mq_和编E语a无关。下面几个小节就要介l了l成Web serviceq_的这三个技术?
XML和XSD
可扩展的标记语言(XML)是Web serviceq_中表C数据的基本格式。除了易于徏立和易于分析外,XML主要的优点在于它既是q_无关的,又是厂商无关的。无x是比技术优性更重要的:软g厂商是不会选择一个由竞争Ҏ所发明的技术的?
XML解决了数据表C的问题Q但它没有定义一套标准的数据cdQ更没有说怎么L展这套数据类型。例如,整Ş数到底代表什么?16位,32位,q是64位?q些l节对实C操作性都是很重要的。W3C制定的XML Schema(XSD)是专门解决q个问题的一套标准。它定义了一套标准的数据cdQƈl出了一U语a来扩展这套数据类型。Web serviceq_是用XSD来作为其数据cdpȝ的。当你用某种语言(如VB.NET或C#)来构造一个Web serviceӞZW合Web service标准Q所有你使用的数据类型都必须被{换ؓXSDcd。你用的工具可能已经自动帮你完成了这个{换,但你很可能会Ҏ你的需要修改一下{换过E。在W二章中Q我们将深入XSDQ学习怎样转换自定义的数据cd(例如c?到XSD的类型?
SOAP
Web service建好以后Q你或者其他h׃去调用它。简单对象访问协?SOAP)提供了标准的RPCҎ来调用Web service。实际上QSOAP在这里有点用词不当:它意味着下面的Web service是以对象的方式表C的Q但事实q不一定如此:你完全可以把你的Web service写成一pd的C函数Qƈ仍然使用SOAPq行调用。SOAP规范定义了SOAP消息的格式,以及怎样通过HTTP协议来用SOAP。SOAP也是ZXML和XSD的,XML是SOAP的数据编码方式。第三章我们会讨论SOAPQƈl识SOAP消息的各U元素?
WSDL
你会怎样向别Zl你的Web service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚臛_能会口头上告诉需要用你的Web service的h。这些非正式的方法至都有一个严重的问题Q当E序员坐到电脑前Q想要用你的Web service的时候,他们的工?如Visual Studio)无法l他们提供Q何帮助,因ؓq些工具Ҏ׃了解你的Web
service。解x法是Q用机器能阅ȝ方式提供一个正式的描述文档。Web service描述语言(WSDL)是q样一个基于XML的语aQ用于描qWeb service及其函数、参数和q回倹{因为是ZXML的,所以WSDL既是机器可阅ȝQ又是h可阅ȝQ这是一个很大的好处。一些最新的开发工h能根据你的Web service生成WSDL文档Q又能导入WSDL文档Q生成调用相应Web service的代码?/p>
跨越防火墙的通信
如果你的应用E序有成千上万的用户Q而且他们都分布在世界各地Q那么客L和服务器之间的通信是一个棘手的问题。那是因为客L和服务器之间通常都会有防火墙或者代理服务器。在q种情况下,你想使用DCOM׃是那么简单了Q而且Q通常你也不愿意把你的客户端程序发布到如此庞大数量的每一个用h中。于是,你最l选择了用览器作为客LQ写下一堆ASP面Q把应用E序的中间层暴露l最l用戗结果呢?q气好的话,只是开发难度大了一些,q气不好的话Q就会得C个根本无法维护的应用E序?/p>
惌一下你应该怎么在你的应用程序里面加入一个新的页?你必d建立好用L?Web面)Q以及在q个面后面Q包含相应商业逻辑的中间层lg。这q不够,你还要再建立臛_一个ASP面Q用来接受用戯入的信息Q调用中间层lgQ把l果格式化ؓHTML形式Q最后还要把"l果?送回览器。要是客L代码不再如此依赖于HTML表单Q客L的编E不q单多了吗?q有Q徏立ASP面的那一步可以省略掉?
当然。如果你的中间层lg是Web service的话Q你完全可以从用L面直接调用中间层lgQ从而省掉徏立ASP面的那一步。要调用Web serviceQ你可以直接使用Microsoft SOAP Toolkit?NETq样的SOAP客户端,也可以用你自己开发的SOAP客户端,然后把它和你的应用程序连接v来。这样做Q不仅可以羃短开发周期,q可以减代码的复杂度,q增强整个应用程序的可维护性。同Ӟ你的应用E序也不再需要在每次调用中间层组件时Q都跌{到相应的"l果?了?/p>
以我的经验来看,在一个用L面和中间层有较多交互的应用程序中Q用Web serviceq种l构Q可以轻杄节省花在用户界面~程上的20%的开发时间。这样做q有另一个好处,是你将得到一个由Web servicel成的中间层Q这一层是完全可以在应用程序集成或其他场合下被重用的。最后,通过Web service把你的应用程序的逻辑和数据暴露出来,q可以让其它q_上的客户重用你的应用E序?/p>
应用E序集成
企业U的应用E序开发者都知道Q企业里l常都要把用不同语言写成的在不同q_上运行的各种E序集成hQ而这U集成将p很大的开发的力量。你的应用程序经帔R需要从q行在古老的IBML上的E序中获取数?或者再把数据发送到L或UNIX应用E序中去。即使是在同一个^CQ不同的软g厂商生的各UY件也常常需要集成v来。通过Web serviceQ应用程序可以用标准的方法把功能和数据暴露出来,供其它的应用E序使用?/p>
例如Q你有一个订单登录程序,用于d从客h的新订单Q包括客户信息、发货地址、数量、h格和付款方式{信息。同Ӟ你还有一个订单执行程序,用于实际货物发送的理。这两个E序是来自不同Y件厂商的。一份新订单q来之后Q订单登录程序需要通知订单执行E序发送货物。通过在订单执行程序上面增加一层Web serviceQ订单执行程序可以把"AddOrder"函数暴露出来。这P每当有新订单到来Ӟ订单dE序可以调用这个函数来发送货物了。进而通过Web service集成应用E序
B2B的集?/strong>
用Web service集成应用E序Q可以你公司内部的商务处理更加自动化。但当交易跨了你的供应商和客户Q突破了公司的界U时又会怎么样呢?跨公司的商务交易集成通常叫做B2B集成?/p>
Web service是B2B集成成功的关键。通过Web serviceQ你的公司可以把关键的商务应用暴露给指定的供应商和客戗例如,把你的电子下单系l和电子发票pȝ暴露出来Q你的客户就可以以电子的方式向你发送购货订单,而你的供应商则可以以电子的方式把原料采购的发发送给你。当Ӟqƈ不是一个新的概?电子文档交换(EDI)早就是这样了。Web service和EDI之间的主要区别在于,Web service的实现要比EDI单得多,而且Web service是运行在Internet上的Q在世界M地方都可L实现Q这样其q行成本q对较低。不q,Web serviceq不像EDI那样Q是文档交换或B2B集成的一套完整的解决Ҏ。Web service只是B2B集成的一个关键部分,q需要许多其它的部分才能完成q个集成?/p>
用Web service来实现B2B集成的最大好处在于可以轻易实C操作性。只要把你的商务逻辑暴露出来Q成为Web serviceQ你可以让M指定的合作伙伴轻杄调用你的商务逻辑Q而不他们的pȝ在什么^Cq行Q用的是什么开发语a。这样就大大减少了花在B2B集成的上的时间和成本。这L低成本让许多原本无法承受EDI的投资成本的中小企业也能实现B2B集成?/p>
软g重用
软g重用是一个很大的主题Q它有很多的形式和程度。最基本的Ş式是源代码模块或者类一U的重用。另一UŞ式是二进制Ş式的lg重用。当前,像表格控件或用户界面控gq样的可重用软glg在市Z都占有很大的份额。但q类软g的重用都有一个很严重的限?重用仅限于代码,而数据不能被重用。原因在于你可以很轻易的发布lg甚至源代码,但要发布数据没那么Ҏ了,除非那些数据都是不会l常变化的静态数据?/p>
而Web service允许你在重用代码的同Ӟ重用代码后面的数据。用Web serviceQ你不再像以前那P要先从第三方购买、安装Y件组Ӟ再从你的应用E序中调用这些组件。你只需要直接调用远端的Web service可以了。D个例子,你想在你的应用程序中认用户输入的邮件地址Q那么,你只需把这个地址直接发送给相应的Web serviceQ这个Web service ׃帮你查阅街道地址、城市、省区和邮政~码{信息,认q个地址的确在相应的邮政~码区域。Web service 的提供商可以按时间或使用ơ数来对q项服务q行收费。这L服务要通过lg重用来实现是不现实的Q因为那L话你必须下蝲q安装好包含街道地址、城市、省区和邮政~码{信息的数据库,而且q个数据库还是不能实时更新的?/p>
另一UY仉用的情况是把好几个应用程序的功能集成h。例如,你想要徏立一个局域网上的门户站点应用Q让用户既可以查询他们的联邦快递包裹,察看股市行情Q又可以理他们的日E安排,q可以在U购买电q。现在Web上有很多应用E序供应商,都在其应用中实现了上面的q些功能。一旦他们把q些功能都通过Web service 暴露出来Q你可以非常轻易地把所有这些功能都集成C的门L点中Qؓ用户提供一个统一的、友好的界面?/p>
用Web service来集成各U应用中的功能,为用h供一个统一的界?/strong>
许多应用E序都会利用Web serviceQ把当前Zlg的应用程序结构扩展ؓlg和Web service 的合结构。你也可以在应用E序中用第三方的Web service 提供的功能。你q可以把你自q应用E序的功能通过Web service 提供l别人。所有这些情况下Q你都可以重用代码和代码后面的数据。MQWeb service 是软g重用的一U非常有力的形式?/p>
什么时候不应该使用Web Service
一个对Web service的完整介l还应该包括什么时候不该用Web service。经q前面的介绍Q我们知道了Web service 在通过Webq行互操作或q程调用的时候是最有用的。不q,q有许多情况QWeb serviceҎ不能l你带来M好处?/p>
单机应用E序
目前Q我们还有很多桌面应用程序是供商用和个h使用的。其中一些只需要与q行在本Z的其他程序通信。在q种情况下,我们最好就不要再用Web service Q只要用本地的API可以了。COM非常适合于在q种情况下工作,因ؓ它既又快。运行在一台服务器上的服务器Y件也是这?最好直接用COM或其他本地的API来进行应用程序间的调用。当然Web service 也能用在q些情况下,但那样不仅消耗太大,而且不会l你带来M好处?/p>
局域网上的同构应用E序
在许多应用中Q你所有的E序都是用VB或VC开发的Q都在Windowsq_下用COMQ都q行在同一个局域网上。例如,你有两个服务器应用程序需要相互通信Q或者你有一个Win32或WinForm的客L序要q接到局域网上的另一个服务器E序。在q些E序里用DCOM会比SOAP/HTTP有效的多。类似的Q如果你的一?NETE序要连接到LAN上的另一?NETE序Q那么你应该使用.NET remoting。有的是,?NET remoting中,你也可以指定使用SOAP/HTTP来进行Web service 调用。不q最好还是直接通过TCPq行RPC调用Q那样会有效得多。MQ只要你从应用程序结构的角度看来Q有别的Ҏ比Web service 更有效,更可行,那就不要再用Web service?/p>
ȝ
Web service是创建可互操作的分布式应用程序的新^台。Web service 的主要目标是跨^台的可互操作性。ؓ了达到这一目标QWeb service 是完全基于XML、XSD{独立于q_、独立于软g供应商的标准的?/p>
Web service在应用程序跨q_和跨|络q行通信的时候是非常有用的。Web service适用于应用程序集成、B2B集成、代码和数据重用Q以及通过Webq行客户端和服务器的通信的场合?/p>
当然QWeb service也不是万能的Q你不能到处滥用Web service。在有些情况下,Web service 会降低应用程序的性能Q而不会带来Q何好处。例如,一台机器或一个局域网里面q行的同构应用程序就不应该用Web service q行通信?/p>