在ASP.NET Atlas中调用Web Service——创建Mashup调用远端Web Service(基础知识以及简单示例)...

作者:Dflying Chen ( http://dflying.cnblogs.com/

注:Atlas中的Mashup极其复杂,其中涉及众多的对象与架构,为了写这篇文章,我花了不少时间学习研究。同时,关于这方面资源的匮乏简直到了令人发指的地步。往往Google一下居然一条记录都没有……但Mashup在现今的AJAX程序中又是如此重要,近一段时间内,我也收到了好多朋友的消息,希望我能介绍一下Mashup的心得,这里我就斗胆献丑了。但目前为止,我对Atlas中的Mashup也只是粗通皮毛,所以这个系列中将仅仅通过一些实例应用来顺便说出我的理解,其中一定有很多错误疏漏之处,还请各位不吝斧正!也欢迎大家探讨实际项目中遇到的问题。

对于传统的Web程序,浏览器只与一台服务器进行通信,并从这台服务器上得到所有信息。同时出于安全考虑,页面上的JavaScript也只允许和同一台服务器通信。而随着目前Internet的发展,越来越多的Web Service分散在互联网的各处,作为开发人员的我们自然希望能够充分利用这些已经存在的Service,这时,我们就需要对远端的Web Service做以Mashup。这是一项常见的需求,也是一项重复性很高的劳动,幸运的是,ASP.NET Atlas充分认识到了这一点,并对此有着强大的内建支持。

Atlas通过引入一种新的HTTP模块——asbx文件(其中b代表Bridge),来实现对远端Web Service请求的Mashup。asbx文件其实是一个结构化的XML文档,里面包含了对远端Web Service方法的封装,当然,您也可以同时指定一个CodeBehind CS文件用来对其进行一些复杂的控制。asbx文件和aspx文件位于同一台主机上。Atlas网站在编译的时候会根据asbx中的声明以及相应的CodeBehind文件(如果存在)将其编译并注册。这样当客户端JavaScript调用该asbx中定义的方法时,asbx会将其转发给实际的Web Service并将返回结果会送给客户端,起到一个Bridge的作用。而对于客户端,就和直接调用 同一主机上的Web Service没什么不一样。

如果您安装过Atlas的msi文件,并建立了一个Atlas Web Site,那么下面的配置已经为您做好了。否则,启用asbx的支持,您需要如下的操作:

  1. 在IIS的虚拟目录下按照下图所示,添加.asbx文件的映射。
    bridge1-1.jpg
  2. 在web.config的sectionGroup段添加:

None.gif < section  name ="webServices"  type ="Microsoft.Web.Configuration.WebServicesSection"   />
  1. 在web.config的compilation段添加:

None.gif < buildProviders >
None.gif   
< add  extension =".asbx"  type ="Microsoft.Web.Services.BridgeBuildProvider" />
None.gif
</ buildProviders >

  1. 在web.config的httphandlers段添加:
None.gif < add  verb ="*"  path ="*.asbx"  type ="Microsoft.Web.Services.ScriptHandlerFactory"  validate ="false" />
  1. 在web.config的httpmodules段添加:
None.gif < add  name ="BridgeModule"  type ="Microsoft.Web.Services.BridgeModule" />

下面让我们通过一个最简单的示例学习Atlas中Mashup的基本概念和asbx文件的基本结构。

首先,编写一个Web Service用来模拟在Internet上存在的一个服务。当然,这个服务没什么实际用处,仅仅是求两个integer的和:

None.gif using  System;
None.gif
using  System.Web;
None.gif
using  System.Web.Services;
None.gif
using  System.Web.Services.Protocols;
None.gif
None.gif[WebService(Namespace 
=   " http://www.dflying.net/ " )]
None.gif[WebServiceBinding(ConformsTo 
=  WsiProfiles.BasicProfile1_1)]
None.gif
public   class  SimpleWebService : System.Web.Services.WebService
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    [WebMethod]
InBlock.gif    
public int Add(int value1, int value2)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return value1 + value2;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

我将这个Web Service 置于另外一台主机的IIS 上,注意:我们应该更改web.config 文件以允许通过HTTP GET 对Web Service 的访问,而不仅仅是默认的POST :
None.gif < webServices >
None.gif  
< protocols >
None.gif    
< add name = " HttpGet " />
None.gif  
</ protocols  >
None.gif
</ webServices >

完成之后,您可以在浏览器中测试一下,访问: http://dflyingchen/MyServices/SimpleWebService.asmx/Add?value1=1&value2=2 (不要忘记更改前面相应的主机名),如果你能得到下图所示的结果,那么恭喜你,Web Service 没问题了。
bridge1-2.jpg

下面就是最有“技术含量”的asbx文件了:

None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
< bridge  namespace ="Test"  className ="SimpleWebService" >
None.gif
None.gif  
< proxy  type ="Microsoft.Web.Services.BridgeRestProxy"  
None.gif         serviceUrl
="http://dflyingchen/MyServices/SimpleWebService.asmx/Add"   />
None.gif
None.gif  
< method  name ="Add" >
None.gif    
< input >
None.gif      
< parameter  name ="value1"   />
None.gif      
< parameter  name ="value2"   />
None.gif    
</ input >
None.gif  
</ method >
None.gif
</ bridge >

注意到作为一个合法的XML 文件,asbx 文件第一行是XML 的声明。然后,对于本asbx 文件,有如下部分:
  1. bridge段,声明该mashup的namespaceclass name。注意这两个属性代表的是客户端调用时所见的被mashup过的namespace和class name,并不是远端Web Service的namespace和class name。
  2. proxy段,声明该mashup的类型,这里我们指定为Microsoft.Web.Services.BridgeRestProxy相应的,指定一个代表服务URL的string:http://dflyingchen/MyServices/SimpleWebService.asmx/Add
  3. method段,您可以添加多个method段,每一个代表一个定义在上述URL中的服务。这里我们指定了Method的名称,同样的,它代表的仅是客户端调用的名称(这样客户端将以namespace.classname.methodname()的方式调用该mashup)。
  4. input段,其中通过parameter标记声明了该方法的参数。parameter标记中的name属性代表参数名,注意这里声明的参数名要和远端Web Method的参数名保持一致。这里我们声明了两个参数,与上面定义的Web Method的两个参数对应。

到此为止,一个最简单的asbx文件就完成了。当然,上述介绍与完备相距甚远。关于asbx文件中的其它可选声明,目前并没有官方文档,我只能在接下来的几个例子中根据使用情况适当介绍。

我们再来建立一个Atlas Page测试一下该mashup,首先添加一个ScriptManager,并添加对上述mashup的引用,注意扩展名为asbx,不要写习惯了就直接写成了asmx:

None.gif < atlas:ScriptManager  ID ="sm"  runat ="server" >
None.gif    
< Services >
None.gif        
< atlas:ServiceReference  Path ="SimpleBridge.asbx"   />
None.gif    
</ Services >
None.gif
</ atlas:ScriptManager >

然后添加一段HTML ,用来提供用户输入,引发调用并显示结果;
None.gif < input  id ="input1"  type ="text"  value ="1"  size ="3"   />
None.gif
< input  id ="input2"  type ="text"  value ="2"  size ="3"   />
None.gif
< input  id ="doAdd"  type ="button"  value ="Add"  onclick ="return doAdd_onclick()"   />
None.gif
< div  id ="result"   />

最后,一小段JavaScript 调用mashup 方法:
None.gif function doAdd_onclick() {
None.gif    var int1 = $('input1').value;
None.gif    var int2 = $('input2').value;
None.gif    Test.SimpleWebService.Add({'value1': int1,'value2': int2}, onAddComplete);
None.gif}
None.giffunction onAddComplete(result) {
None.gif    $('result').innerHTML = "Result is: " + result;
None.gif}

注意调用方法的签名是Test.SimpleWebService.Add() ,其中的每一部分都在asbx 文件中有所声明。另外,返回值是一个XML string ,这里为了简化,就直接输出到页面上了。

浏览器中如下:
bridge1-3.jpg

示例程序源代码可以在此下载:http://files.cnblogs.com/dflying/SimpleBridgeDemo.rar

在接下来的几个实例中,我将对一些“真实有用”的Web Service进行mashup并应用到我们的程序中。

转载于:https://www.cnblogs.com/dflying/archive/2006/05/24/Atlas_and_Web_Service__Calling_Remote_Service_by_Creating_Mashup__Introduction_and_Basic_Demo.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值