• Atlas 调用web service


           Atlas给我们提供了一种非常简单的方式去调用web service,大大的简化了我们开发的复杂性。在Atlas中标准的调用web service方法是在页面中添加一个ScriptManager然后将所需的web service添加到Services Template下,如:

    <atlas:ScriptManager ID="scriptManager" runat="server" EnableScriptComponents="true"
           
    <Services>
           
        <atlas:ServiceReference Path="~/atlas/samples/services/SimpleService.asmx" />
           
    </Services>
        </
    atlas:ScriptManager>

        这样我们就可以通过如下javascript方法调用到远程的web service

       requestSimpleService = Quickstart.Samples.SimpleService.EchoString(
                document.getElementById('inputName').value,       //params
               
    OnComplete,     //Complete event
               
    OnTimeout       //Timeout event
               
    );

    这个例子可以在atlas doc工程中找到,非常简单。然而,当我们需要在页面加载的时候调用web service的时候,就可能会遇到一定的麻烦了。在atlas doc的示例中也有这个例子,它是通过atlas 扩展的xml-script 客户端开发模式来调用,即如下代码:

    <script type="text/xml-script">
           
    <page xmlns:script="http://schemas.microsoft.com/xml-script/2005">
              <components>
                <application id="application" load="OnApplicationLoad" />
              </components>
            </page>
        </script >

    这样我们就可以写一个名为OnApplicationLoadjavascript函数,在函数中去调用web service,同样非常方便。但是,当我们想用页面的ClientScript.RegisterStartupScript方法给页面添加一个加载时自动调用web service的时候,那麻烦就来了,它会提示你,要调用的web service类型未定义。在保证目标web service存在,ServiceReference引用也添加进来的情况下,为什么会出现这样的错误呢?一种可能是web service还没有被注册。因为我们用RegisterStartupScript注册javacript的,那么是不是这里注册的代码在atlas客户端代码前执行的?没错,问题就出在这里。用Fiddler调试页面请求的过程可以看到有这样一个请求atlas/atlas/samples/services/SimpleService.asmx/js,它返回的代码如下:

    Type.registerNamespace('Quickstart.Samples');

    Quickstart.Samples.SimpleService=new function() {

    this.path = "http://localhost:2236/atlas/atlas/samples/services/SimpleService.asmx";

    this.appPath = "http://localhost:2236/atlas/";

    var cm=Sys.Net.ServiceMethod.createProxyMethod;

    cm(this,"EchoString","s");

    }

    可以看出,这段代码就是atlas自动帮我们注册了web service的引用类型,没有这段类型定义,客户根本就没有我们要调用的类型存在,这里也可以看出,虽然我们调用web service用的命名空间和类型都是我们在服务端定义的一样,但实际上它是被客户端定义过的,实实在在的javacript类型。有了上面的分析后,接下来我们就不难得出我们的解决办法了,是的,在要调用之前先运行上面的js代码。而这样的话,我们也可以不用把web service引用添加到Services Template下。但是它要能被正确执行的前提仍然是要添加ScriptManager组件,因为这些操作需要atlas客户端脚本的支持,当然如果不想用ScriptManager,可以用手工的方式把这个脚本文件引用进来。

    Btw:这两天在学习Prototype.js,它也扩展了javascript,简化了javascriptajax的复杂性,而且构建于它基础的scriptaculous-jshttp://script.aculo.us/)也是一个非常好的ajax框架实现(js)。但是它没有atlas这样更多的封装实现,特别是这两天想用它实现像atlas这么简单的web service调用,到目前还没有找到特别好的办法。实际上atlas如果脱离asp.net仍然可以很好的工作,只不过他的javascript太多了,目前也没有太多的文档说明,如何脱离asp.net,调用它的js库。希望在以后有空能够多看atlasjs库。目前还不了解atlas库和Prototype.js库,是互补的还是可以替换的(只知道$函数在atlas里也有),只能先配合着用了。

  • 相关阅读:
    300万PV的ASP.NET网站使用阿里云的配置建议团队
    上周热点回顾(11.4-11.10)团队
    寻人启事:写得一手好代码的你在哪里?团队
    上周热点回顾(10.28-11.3)团队
    上周热点回顾(10.21-10.27)团队
    上周热点回顾(10.14-10.20)团队
    上周热点回顾(10.7-10.13)团队
    Elasticsearch之sense插件的安装(图文详解)
    Kibana里No Marvel Data Found问题解决(图文详解)
    Squirrel的安装(windows上Phoneix可视化工具)
  • 原文地址:https://www.cnblogs.com/hjf1223/p/420544.html
Copyright © 2020-2023  润新知