随笔-313  评论-12138  文章-1  trackbacks-256

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

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

  1. IIS的虚拟目录下按照下图所示,添加.asbx文件的映射。
  2. web.configsectionGroup段添加:

<section name="webServices" type="Microsoft.Web.Configuration.WebServicesSection" />
  1. web.configcompilation段添加:

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

  1. web.confighttphandlers段添加:
<add verb="*" path="*.asbx" type="Microsoft.Web.Services.ScriptHandlerFactory" validate="false"/>
  1. web.confighttpmodules段添加:
<add name="BridgeModule" type="Microsoft.Web.Services.BridgeModule"/>

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

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

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace 
= "http://www.dflying.net/")]
[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
public class SimpleWebService : System.Web.Services.WebService
{
    [WebMethod]
    
public int Add(int value1, int value2)
    
{
        
return value1 + value2;
    }

}

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

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

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

<?xml version="1.0" encoding="utf-8" ?>
<bridge namespace="Test" className="SimpleWebService">

  
<proxy type="Microsoft.Web.Services.BridgeRestProxy" 
         serviceUrl
="http://dflyingchen/MyServices/SimpleWebService.asmx/Add" />

  
<method name="Add">
    
<input>
      
<parameter name="value1" />
      
<parameter name="value2" />
    
</input>
  
</method>
</bridge>

注意到作为一个合法的XML文件,asbx文件第一行是XML的声明。然后,对于本asbx文件,有如下部分:
  1. bridge段,声明该mashupnamespaceclass name。注意这两个属性代表的是客户端调用时所见的被mashup过的namespaceclass name,并不是远端Web Servicenamespaceclass name
  2. proxy段,声明该mashup的类型,这里我们指定为Microsoft.Web.Services.BridgeRestProxy相应的,指定一个代表服务URLstringhttp://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

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

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

最后,一小段JavaScript调用mashup方法:

function doAdd_onclick() {
    var int1 = $('input1').value;
    var int2 = $('input2').value;
    Test.SimpleWebService.Add({'value1': int1,'value2': int2}, onAddComplete);
}
function onAddComplete(result) {
    $('result').innerHTML = "Result is: " + result;
}

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

浏览器中如下:

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

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

posted on 2006-05-24 15:20 Dflying Chen 阅读(6094) 评论(33) 编辑 收藏

评论:
#1楼 2006-05-24 17:06 | shalala      
支持~
不知道为啥到现在还没有mashup的官方指南。难道以后就是凭自己瞎摸索么

 回复 引用 查看   
#2楼[楼主] 2006-05-24 17:23 | Dflying Chen      
@shalala
呵呵,还早呢……

 回复 引用 查看   
#3楼 2006-05-24 20:25 | 肖芹[未注册用户]
It's very good!
 回复 引用   
#4楼[楼主] 2006-05-24 20:30 | Dflying Chen      
@肖芹
thanks :)

 回复 引用 查看   
#5楼[楼主] 2006-05-24 20:32 | Dflying Chen      
顺便预告一下,依照由浅入深的原则,第二篇将是对Yahoo! Weather的Mashup,第三篇将是对Google或MSN Search的Mashup。
 回复 引用 查看   
#6楼 2006-05-24 22:42 | Granttan[未注册用户]
谢谢!正好不知道如何调用,真及时,呵呵!
 回复 引用   
#7楼[楼主] 2006-05-25 08:50 | Dflying Chen      
@Granttan
:)

 回复 引用 查看   
#8楼 2006-05-25 11:39 | 网际飞狐      
是不是只能调用通过HTTP GET访问Web Service的方法
 回复 引用 查看   
#9楼[楼主] 2006-05-25 11:40 | Dflying Chen      
@网际飞狐
应该不是的,摸索中……

 回复 引用 查看   
#10楼 2006-05-25 19:31 | 网际飞狐      
我试了一下,好像不行,如果有办法还忙告知一下。
 回复 引用 查看   
#11楼[楼主] 2006-05-25 19:43 | Dflying Chen      
@网际飞狐
请用Fiddler查看一下网络通信,并把错误信息告诉我.这样泛泛的问题让我无从下手。

 回复 引用 查看   
#12楼 2006-05-25 22:14 | Granttan[未注册用户]
我在调试的时候发现,成功后,如果把serviceUrl改为错误的,居然还可以运行!还有就是如果我在WS中写两个WebMethod,发现有一个调用后没有回应,不知道是什么原因?
 回复 引用   
#13楼 2006-05-25 22:33 | Granttan[未注册用户]
居然重新起动就可以了,晕死!
 回复 引用   
#14楼[楼主] 2006-05-26 09:08 | Dflying Chen      
@Granttan
每次修改asbx文件后都需要Clean Solution后重新编译,这也是VS的不足之处。

 回复 引用 查看   
#15楼 2006-05-26 20:21 | 鑰佺緟[未注册用户]
請問dfying老大,Mashup怎麼解釋啊?
 回复 引用   
#16楼[楼主] 2006-05-26 21:13 | Dflying Chen      
@鑰佺緟
我也不知道如何翻译。
Mashup的意思就是在自己的服务器上对远程的Web Service进行一次包装。

 回复 引用 查看   
#17楼 2006-05-29 17:21 | wzcn[未注册用户]
我利用VS2005自动生成的站点,没有办法设置asbx的映射。是不是把“默认站点”的设置改一下也行呢?
 回复 引用   
#18楼[楼主] 2006-05-29 17:34 | Dflying Chen      
@wzcn
什么叫“VS2005自动生成的站点“?

 回复 引用 查看   
#19楼 2006-05-29 17:40 | wzcn[未注册用户]
namespace="Test" className="SimpleWebService">
Test 与 SimpleWebService 与WebService的名称没有关系吧。

 回复 引用   
#20楼 2006-05-29 17:43 | wzcn[未注册用户]
@Dflying Chen
不好意思,我没说清楚,就是VS2005中BROWSE IN IE会自动创建一个站点。图标在右下角。这个站点在哪设置呢?

 回复 引用   
#21楼[楼主] 2006-05-29 18:10 | Dflying Chen      
@wzcn
哦,这里不用设置的

 回复 引用 查看   
#22楼[楼主] 2006-05-29 18:10 | Dflying Chen      
@wzcn
没有关系的

 回复 引用 查看   
#23楼 2006-05-29 21:12 | wzcn[未注册用户]
Microsoft.Web.Atlas.dll是不是有版本问题。我的版本是:
FileVersion:2.0.50727.60406
ProductVersion:2.0.50727.60406您用的是什么版本?

 回复 引用   
#24楼[楼主] 2006-05-30 08:59 | Dflying Chen      
@wzcn
一样的阿

 回复 引用 查看   
#25楼 2006-10-09 17:25 | hnshouping[未注册用户]
Test.SimpleWebService.Add({'value1':int1,'value2':int2},onAddComplete)
我照样写这程序是不知怎么不会调用onAddComplete函数,请问这是为什么.

 回复 引用   
#26楼 2006-10-10 09:14 | hnshouping[未注册用户]
我现在找到原因是因为,但我是在我自己的网址上写了一个web服务,asbx中是这样写的.http://localhost/fifthly_Two/SimpleWebService.asmx/Add.我用http://localhost/fifthly_Two/SimpleWebService.asmx是可有webservice页面显示,但当我键入http://localhost/fifthly_Two/SimpleWebService.asmx/Add?value1=1&value2=2时显示"因 URL 意外地以“/Add”结束,请求格式无法识别"请问这是为什么,调用远端Web Service时出现错误(无法联接到远程服务器)
 回复 引用   
#27楼[楼主] 2006-10-14 01:40 | Dflying Chen      
@hnshouping
在Web Service项目的Web.config的<system.web>里加上:
<webServices>
<protocols>
<add name="HttpPost" />
<add name="HttpGet" />
</protocols>
</webServices>

 回复 引用 查看   
#28楼 2006-10-19 16:10 | MK2      
像Gmail提供的RSS读取器,这是不是也算MashUp呢?
或许Mashup是一个很好的Web服务助理······WebService是供货商,通过MashUp来做销售,用户向MashUp购买。。。。。呵呵

 回复 引用 查看   
#29楼[楼主] 2006-10-19 19:01 | Dflying Chen      
@MK2
可以算作吧,其实这才是Web 2.0的本质阿,聚合分散的数据。

 回复 引用 查看   
#30楼 2008-07-22 16:55 | 新网的花生      
未能加载类型Microsoft.Web.Services.BridgeBuildProvider是怎么回事啊????
 回复 引用 查看   
#31楼 2008-08-22 16:11 | 听棠.NET      
楼主,你的文章蛮好的,但我目前面对的不是Web Service。
而是WCF所提供的svc服务。我不知道如何来使用这个bridge进行跨域?

 回复 引用 查看   
除非特别声明,本站内所有资源,包括但不限于文章,代码,图片等,均应用于Dflying版权说明
关于ASP.NET AJAX,您可以:
直接阅读ASP.NET AJAX文章分类
Atlas文章打包下载(截至4/28/2006)
加入ASP.NET AJAX学习团队
询问关于ASP.NET AJAX的问题
加入ASP.NET AJAX讨论群
阅读愚作《ASP.NET AJAX程序设计》
点击阅读
点击阅读


关于Windows Vista,您可以:
加入Windows Vista开发团队!
昵称:Dflying Chen
园龄:5年10个月
粉丝:127
关注:0

搜索

 
 

最新随笔

随笔分类(352)

随笔档案(313)

Blog Roll

Dflying的其他Blog

Online Chat

统计信息

积分与排名

  • 积分 - 2442908
  • 排名 - 7

最新评论

阅读排行榜

评论排行榜