科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件利用微软Atlas消费外部Web服务

利用微软Atlas消费外部Web服务

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

为了从Atlas中消费外部Web服务,你可以为这些服务构建一个基于服务器的Web服务代理。幸好,你可以利用Visual Studio和Atlas特征来处理这其中的大部分工作。

作者:朱先忠编译 来源:天极开发 2007年11月3日

关键字: Atlas 消费 Web服务

  • 评论
  • 分享微博
  • 分享邮件
一、引言

  如今,AJAX已经成为构建基于浏览器的交互式客户端应用程序的主流技术,从而使得服务器端行为集中于提供特定的Web服务。另一方面,Web服务已经成为当今在服务器级暴露业务功能的事实上的标准。假定如此,那么出现一个核心开发问题:如何使你的基于AJAX的应用程序与Web服务进行通讯?本文正是想同你一起探讨如何使用微软Atlas(最近,又命名为ASP.NET AJAX)来实现这一目的。

  首先,你需要使用Visual Studio 2005,并且需要下载和安装微软Atlas。如果你没有安装Visual Studio 2005,那么你可以下载一个免费的Visual Studio Express版本。本文将使用一个ZipCodeRUs示例应用程序来解释如何通过Atlas实现该程序与Web服务的交互。这个示例应用程序能够检索详细的邮政代码信息,例如城市、县的名称及其纬度、经度等信息。该程序依赖于tilisoft.com网站提供的一个免费且公开可用的Web服务来检索该信息。这个示例应用程序从下面两个角度展示了Atlas的Web服务威力:

  · 展示了Atlas的JavaScript代理,这个代理能够与一个ASP.NET(.asmx)Web服务(该服务担当到外部Tilisoft ZIP代码Web服务的"沟通"桥梁)进行异步地通讯。

  · 还展示Atlas从JavaScript客户端成批地调用服务器端web服务的能力。

  【作者注】 微软Atlas还支持创建到外部Web服务的基于XML的声明性桥接而不必创建上面的所谓"沟通"服务;不过,本文并没有涉及有关这个桥接特征的讨论。

  二、Atlas Web服务入门

  打开Visual Studio,通过选择如图1所示的"Atlas"Web Site模板创建一个新的Web应用程序"ZipCodeRUs"。该"Atlas"Web Site模板是当你下载并安装微软Atlas CTP时安装的。基于这个"Atlas"Web Site模板创建的网站中会自动包含对Microsoft.Web.Atlas.dll的一个引用;还包括一个Web.config文件,该文件为网站使用Atlas技术作好了预配置。


图1.创建一个新的Atlas Web应用程序:当你安装微软Atlas CTP后,你会在"New Web Site"对话框中看到一个新的称为"Atlas"Web Site的工程模板。

  与依赖于外部Web服务(服务不是在与应用程序本身相同的域内提供)的AJAX应用程序相关的一个常见的问题是,你不能够使用JavaScript来直接存取这样的Web服务-浏览器将阻止所有这样的"cross-scripting"存取。由于安全原因,浏览器仅仅允许一个Web页面中的JavaScript存取最初创建该页面的网站。为了解决这个问题,Atlas JavaScript客户端依赖于.asmx文件(ASP.NET Web服务)来创建运行时刻JavaScript代理。换句话说,客户端先调用一个由home(本地)域所暴露的Web服务,然后由这个服务再调用外部Web服务,最后简单地把响应传送回客户端。

  因此,在你能够从你的Atlas客户端调用一个外部Web服务前,你首先需要创建一个强类型化代理。在这个示例中,我为Zip代码Web服务构建了一个C#代理,其中还创建了一个ASP.NET Web服务,它用作一个上面的"沟通桥梁"。

  三、 创建一个代理客户类

  存在两种创建Web服务客户端代理类的方法。你可以在Visual Studio命令行上使用wsdl.exe来创建这些代理类;或者从Visual Studio IDE中创建一个Web引用。下面命令展示了如何从你的应用程序的App_Code文件夹下使用wsdl.exe来为ZipCode Web服务创建强类型化代理类。注意,当你从命令行输入下列代码时,下面这些内容应该在同一行上。

C:\projects\ZipCodeRUS\App_code> wsdl.exe
http://www.tilisoft.com/ws/LocInfo/ZipCode.asmx?WSDL
/namespace:Tilisoft.ZipCode

  上面的命令将创建一个ZipCode.cs文件,它包含一个你能够在你的本地的代码中使用的TiliSoft.ZipCode代理类。

  接下来,你需要创建上面起"沟通桥梁"作用的Web服务。右击Solution Explorer中的最上面一层,并从弹出菜单中选择"Add New Item…"选项,然后选择Web服务模板。我把该服务命名为"ZipCodeConduitService"。

  这个ZipCodeConduitService服务中只提供了一个称为GetZipCodeInfo的函数。它使用两个字符串参数:一个字符串correlationID,一个ZIP代码。当被调用时,该服务使用生成的代理类以便TiliSoft Web服务检索特定数据,最后,把这些结果传递回ZipCodeConduitData应用程序。为了演示Atlas的异常处理能力,我添加了一个"小拐弯":如果用户输入的ZIP代码是"错误",那么GetZipCodeInfo()将抛出一个ZipCodeConduitException异常。下面是相应于ZipCodeConduitService Web服务类的代码:

...
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ZipCodeConduitService : System.Web.Services.WebService{
 ...
 [WebMethod]
 public ZipCodeConduitData GetZipCodeInfo(String corelationId,String zipCode) {
  if (zipCode.Equals("error")){
   throw new ZipCodeConduitException(corelationId,"Here is an error just for you!! Enjoy!");
  }
  ZipCode xZipCodeService = new ZipCode();
  ZipCodeConduitData zipCodeConduitData = null;
  ZipCodeData xZipCodeData = xZipCodeService.GetInfo(zipCode);
  zipCodeConduitData = new ZipCodeConduitData(corelationId, zipCode, xZipCodeData);
  return zipCodeConduitData;
 }
}

  在前面的代码中,ZipCodeConduitData是一个值对象,用于在客户端和ZipCodeConduitService之间传递信息。这个ZipCodeConduitData类具有如下所示的get属性,而CorelationId属性允许客户端跟踪它们的请求。

...
using Tilisoft.ZipCode;
public class ZipCodeConduitData{
 public ZipCodeConduitData(String corelationId,ZipCodeData data) {
  hydrate(corelationId, data);
 }
 String _corelationId;
 public String CorelationId{
  get { return _corelationId; }
 }
 ...
 String _county;
 public String County{
  get { return _county; }
 }
 String _city;
 public String City{
  get { return _city; }
 }
 ...
 private void hydrate(String corelationId, ZipCodeData data) {
  _corelationId = corelationId;
  if (data.ZipCodeInfo.Count > 0) {
   _zipCode = data.ZipCodeInfo[0].ZIPCODE;
   _county = data.ZipCodeInfo[0].COUNTY;
   _city = data.ZipCodeInfo[0].CITY;
   ...
  }
 }
}

  这个ZipCodeConduitException是一个派生自System.Exception的C#异常类。该异常类包括correlationId值;客户端在每次发送请求时都使用它,详见下面的代码片断:

...
using System;
...
public class ZipCodeConduitException : System.Exception{
 String _corelationId;
 public String CorelationId{
  get { return _corelationId; }
  set { _corelationId = value; }
 }
 public ZipCodeConduitException(String corelationId, String message):base(message) {
  _corelationId = corelationId;
 }
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章