在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…

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

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

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

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

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…

pandas之Seris和DataFrame

pandas是一个强大的python工具包&#xff0c;提供了大量处理数据的函数和方法&#xff0c;用于处理数据和分析数据。 使用pandas之前需要先安装pandas包&#xff0c;并通过import pandas as pd导入。 一、系列Series Seris为带标签的一维数组&#xff0c;标签即为索引。 1.Seri…

机器学习:分类_机器学习基础:K最近邻居分类

机器学习:分类In the previous stories, I had given an explanation of the program for implementation of various Regression models. Also, I had described the implementation of the Logistic Regression model. In this article, we shall see the algorithm of the K…

安卓中经常使用控件遇到问题解决方法(持续更新和发现篇幅)(在textview上加一条线、待续)...

TextView设置最多显示30个字符。超过部分显示...(省略号)&#xff0c;有人说分别设置TextView的android:signature"true",而且设置android:ellipsize"end";可是我试了。居然成功了&#xff0c;供大家參考 [java] view plaincopy<TextView android:id…

垃圾邮件分类 python_在python中创建SMS垃圾邮件分类器

垃圾邮件分类 python介绍 (Introduction) I have always been fascinated with Google’s gmail spam detection system, where it is able to seemingly effortlessly judge whether incoming emails are spam and therefore not worthy of our limited attention.我一直对Goo…

简单易用的MongoDB

从我第一次听到Nosql这个概念到如今已经走过4个年头了&#xff0c;但仍然没有具体的去做过相应的实践。最近获得一段学习休息时间&#xff0c;购买了Nosql技术实践一书&#xff0c;正在慢慢的学习。在主流观点中&#xff0c;Nosql大体分为4类&#xff0c;键值存储数据库&#x…

java断点续传插件_视频断点续传+java视频

之前仿造uploadify写了一个HTML5版的文件上传插件&#xff0c;没看过的朋友可以点此先看一下~得到了不少朋友的好评&#xff0c;我自己也用在了项目中&#xff0c;不论是用户头像上传&#xff0c;还是各种媒体文件的上传&#xff0c;以及各种个性的业务需求&#xff0c;都能得到…

tomcat中设置Java 客户端程序的http(https)访问代理

1、假定http/https代理服务器为 127.0.0.1 端口为8118 2、在tomcat/bin/catalina.sh脚本文件中设置JAVA_OPTS&#xff0c;如下图&#xff1a; 保存后重启tomcat就能生效。转载于:https://www.cnblogs.com/zhangmingcheng/p/11211776.html

MQTT服务器搭建--Mosquitto用户名密码配置

前言&#xff1a; 基于Mosquitto服务器已经搭建成功&#xff0c;大部分都是采用默认的是允许匿名用户登录模式&#xff0c;正式上线的系统需要进行用户认证。 1.用户参数说明 Mosquitto服务器的配置文件为/etc/mosquitto/mosquitto.conf&#xff0c;关于用户认证的方式和读取的…

压缩/批量压缩/合并js文件

写在前面 如果文件少的话&#xff0c;直接去网站转化一下就行。 http://tool.oschina.net/jscompress?type3 1.压缩单个js文件 cnpm install uglify-js -g 安装 1>压缩单个js文件打开cmd,目录引到当前文件夹&#xff0c;cduglifyjs inet.js -o inet-min.js 或者 uglifyjs i…

软件安装(JDK+MySQL+TOMCAT)

一&#xff0c;JDK安装 1&#xff0c;查看当前Linux系统是否已经安装了JDK 输入 rpm -qa | grep java 如果有&#xff1a; 卸载两个openJDK&#xff0c;输入rpm -e --nodeps 要卸载的软件 2&#xff0c;上传JDK到Linux 3&#xff0c;安装jdk运行需要的插件yum install gl…

TensorFlow 2.X中的动手NLP深度学习模型准备

简介&#xff1a;为什么我写这篇文章 (Intro: why I wrote this post) Many state-of-the-art results in NLP problems are achieved by using DL (deep learning), and probably you want to use deep learning style to solve NLP problems as well. While there are a lot …

静态代码块

静态代码块 静态代码块&#xff1a;定义在成员位置&#xff0c;使用static修饰的代码块{ }。位置&#xff1a;类中方法外。执行&#xff1a;随着类的加载而执行且执行一次&#xff0c;优先于main方法和构造方法的执行。格式&#xff1a;作用&#xff1a; 给类变量进行初始化赋值…

学java 的要点_零基础学Java,掌握Java的基础要点

对于程序员群体来说&#xff0c;了解一定的技巧会对学习专业技能更有帮助&#xff0c;也更有助于在自己的职业发展中处于有利地位&#xff0c;无限互联Java培训专家今天就为大家总结Java程序员入门时需要掌握的基础要点&#xff1a;掌握静态方法和属性静态方法和属性用于描述某…

实验人员考评指标_了解实验指标

实验人员考评指标In the first part of my series on experimental design Thinking About Experimental Design, we covered the foundations of an experiment: the goals, the conditions, and the metrics. In this post, we will move away from the initial experimental…

核心技术java基础_JAVA核心技术I---JAVA基础知识(集合set)

一&#xff1a;集合了解(一)确定性&#xff0c;互异性&#xff0c;无序性确定性&#xff1a;对任意对象都能判定其是否属于某一个集合互异性&#xff1a;集合内每个元素都是无差异的&#xff0c;注意是内容差异无序性&#xff1a;集合内的顺序无关(二)集合接口HashSet&#xff…

nba数据库统计_NBA板块的价值-从统计学上讲

nba数据库统计The idea is not to block every shot. The idea is to make your opponent believe that you might block every shot. — Bill Russel这个想法不是要阻止每一个镜头。 这个想法是让你的对手相信你可能会阻挡每一个投篮。 —比尔罗素 The block in basketball ha…