在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.gifusing 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.giffunction 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java弹框形式输入_java中点击一个按钮弹出两个输入文本框的源代码

展开全部写了一个很简单的案例,可以参考和修改import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;import…

sap wm内向交货步骤_内向型人在数据科学中成功的五个有效步骤

sap wm内向交货步骤Just like most attributes of humans, including both the bright and dark sides, being an introvert is no exception. This article was not written to inspire you as most articles about data science or engineering do. What we want is that by …

C# 学习之路--百度网盘爬虫设计与实现(一)

百度网盘爬虫 现在市面上出现了很多网盘搜索引擎&#xff0c;写这系列博文及爬虫程序的初衷&#xff1a; 更方面的查找资源学习C#学习爬虫的设计与实现记录学习历程自我监督 能力有限&#xff0c;如有不妥之处&#xff0c;还请各位看官点评。同在学习的网友~与君共勉。工具/库选…

实习生对企业的认识_如何成为您认识的超级明星实习生

实习生对企业的认识by Maple Ong由Maple Ong 如何成为您认识的超级明星实习生 (How to be The Superstar Intern You Know You Are) 遏制冒名顶替综合症&#xff0c;为即将到来的软件工程实习做准备 (Curb the Impostor Syndrome and get prepared for your upcoming Software…

7时过2小时是几时_2017最北师大版二年级下册数学第七单元《时、分、秒》过关检测卷...

二年级数学下册时分秒测试卷一、填一填。(每空1分&#xff0c;共36分)1.钟面上有()大格&#xff0c;()个小格&#xff0c;时针走1个大格是()时&#xff0c;分针走一个大格是()分。2.1分()秒()分1时1分15秒()秒3.1小时20分()分90分()小时()分 70秒()分()秒4.用时、分、秒填空a)我…

在没人相信的时候,你的坚持才真正可贵

2018 世界 VR 产业大会在南昌开幕&#xff0c;阿里巴巴创始人马云在演讲中说&#xff1a; “在人人都相信一个产业的时候&#xff0c;其实你已经没有机会了。在没有人相信的时候&#xff0c;你的坚持才是真正的珍贵。很多人是因为看见而相信&#xff0c;只有很少数的人是因为相…

leetcode 49. 字母异位词分组(排序+hash)

给定一个字符串数组&#xff0c;将字母异位词组合在一起。字母异位词指字母相同&#xff0c;但排列不同的字符串。 示例: 输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [ [“ate”,“eat”,“tea”], [“nat”,“tan”], [“bat”] ] 代码 class S…

数据库备份策略 分布式_管理优秀的分布式数据团队的4种基本策略

数据库备份策略 分布式COVID-19 has forced nearly every organization to adapt to a new workforce reality: distributed teams. We share four key tactics for turning your remote data team into a force multiplier for your entire company.COVID-19迫使几乎每个组织都…

如何使用阿里云云解析API实现动态域名解析,搭建私有服务器

原文地址&#xff1a;http://www.yxxrui.cn/article/116.shtml 未经许可请勿转载&#xff0c;如有疑问&#xff0c;请联系作者&#xff1a;yxxrui163.com 公司的网络没有固定的公网IP地址&#xff0c;但是能够保证的是&#xff0c;每次动态分配的IP地址均为独立的公网IP&#x…

新手指南:dvwa_如何构建基本的Slackbot:新手指南

新手指南:dvwaBy Vishwa ShahVishwa Shah着 Update: code and tutorial updated on June 28 to reflect Slack API changes.更新&#xff1a;代码和教程已于6月28日更新&#xff0c;以反映Slack API的更改 。 Slackbots&#xff1a;为什么要使用它们&#xff1f; (Slackbots:…

java 加载class文件路径_动手实现MVC: 1. Java 扫描并加载包路径下class文件

背景用过spring框架之后&#xff0c;有个指定扫描包路径&#xff0c;然后自动实例化一些bean&#xff0c;这个过程还是比较有意思的&#xff0c;抽象一下&#xff0c;即下面三个点如何扫描包路径下所有的class文件如何扫描jar包中对应包路径下所有的class文件如何加载class文件…

leetcode 738. 单调递增的数字(贪心算法)

给定一个非负整数 N&#xff0c;找出小于或等于 N 的最大的整数&#xff0c;同时这个整数需要满足其各个位数上的数字是单调递增。 &#xff08;当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。&#xff09; 示例 1: 输入: …

python+[:]+切片_我从C ++到Python的方式:概念上的改变

python[:]切片by asya f由asya f 我从C 到Python的方式&#xff1a;概念上的改变 (How I went from C to Python: a conceptual change) 介绍 (Introduction) People say that coding in Python is so easy that even a 6 year old can do it. This was the thought that I ha…

深度学习 免费课程_2020年排名前三的免费深度学习课程

深度学习 免费课程&#xff03;1 Fastai面向程序员的实用深度学习2020 (#1 Fastai Practical Deep Learning for Coders 2020) On 21 of August 2020, fastai released the new version of the fastai library and of their Deep Learning course!2020年8月21日&#xff0c;fas…

mysql复制主从集群搭建

近期搭了个主从复制。中间出了点小问题&#xff0c;排查搞定&#xff0c;记录下来1环境&#xff1a;虚拟机&#xff1a;OS:centos6.5Linux host2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/LinuxserverIP192.168.18.66192.168.18.6…

java jolt tuxedo_java通过jolt调用tuxedo服务.xls

java通过jolt调用tuxedo服务.xls还剩20页未读&#xff0c;继续阅读下载文档到电脑&#xff0c;马上远离加班熬夜&#xff01;亲&#xff0c;喜欢就下载吧&#xff0c;价低环保&#xff01;内容要点&#xff1a;?private bea.jolt.pool.servlet.ServletSessionPoolManager bool…

你的周末时光是什么样的?

周末是一个特殊的假日&#xff0c;隔三差五就会有&#xff0c;来的容易去得也容易&#xff0c;即便如此&#xff0c;我们还是应该好好珍惜&#xff0c;周末可以做的事太多了&#xff0c;既可以用来减压&#xff0c;也可以为下一周的学习和工作充电&#xff0c;不管做什么&#…

leetcode 290. 单词规律(hash)

给定一种规律 pattern 和一个字符串 str &#xff0c;判断 str 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern “abba”, str “dog…

2019年微博用户画像_2019年您需要了解的有关用户的信息

2019年微博用户画像by Yisroel Yakovson通过伊斯洛尔雅科夫森 2019年您需要了解的有关用户的信息 (What You Need to Know About Your Users in 2019) Users have changed a lot in the last few years. We programmers may have a culture gap to overcome in this area. If …

使用lt;jsp:includegt;,不想写死URL,动态生成URL的解决的方法

JSP中文件包括有2种方式&#xff0c;静态包括和动态包括。静态包括使用<% include file"" %>。动态包括使用<jsp:include page"" />。本文不打算介绍这2种方式的差别和使用场景&#xff0c;主要关注page和file属性的路径问题。 假设事先知道被…