ASP.NET AJAX之内部揭秘永利会娱乐

原作地址:http://www.codeproject.com/KB/ajax/aspnetajaxtips.aspx
[原稿源码下载]

[索引页] [源码下载]

[翻译]ASP.NET AJAX之内部揭秘

新瓶旧酒ASP.NET AJAX(10) – 客户端脚本编制程序(Sys.Services命名空间下的类)

初稿宣布日期:2005.12.22
作者:About Omar Al
Zabir

翻译:webabcd
审校:Tony Qu 

作者:webabcd

介绍
微软前段时间透露了ASP.NET AJAX的Beta
2版。即便它是三个极度庞大的框架,但是当您在web
2.0的社会风气中要开垦二个的确的AJAX
web站点的话,就能遇见重重主题素材,并且你大概找不到其余相关文书档案。本文中,作者将介绍一些在开采Pageflakes中所学习到的高档经验。大家将会看到ASP.NET
AJAX一些功能的利害,如批调用(Batch
Call),调用超时,浏览器调用拥堵难点,ASP.NET 2.0中web
service响应缓存的bug等等。

介绍
ASP.NET
AJAX的Sys.Services.AuthenticationService类、Sys.Services.ProfileService类、Sys.Services.ProfileGroup类完美地和ASP.NET
2.0的Membership和Profile举行了合併

正文最终更新:二零零五年三月十日,针对ASP.NET AJAX
RC更新(译注:适用于ASP.NET AJAX v1.0)

关键
1、Sys.Services.AuthenticationService类的login()方法
    Sys.Services.AuthenticationService.login(userName, password,
isPersistent, customInfo, redirectUrl, loginCompletedCallback,
failedCallback, userContext);
    ·userName – 用户名
    ·password – 密码
    ·isPersistent – 是或不是跨浏览器保存认证音讯(悠久保留)
    ·customInfo – 保留字段,只怕在明日选拔
    ·redirectUrl – 登陆成功后重定向到的UPRADOL
    ·loginCompletedCallback – 登陆成功后的回调函数
    ·failedCallback – 报到战败后的回调函数
    ·userContext – 用户上下文
    WebService中与其对应的方式 – public bool Login()

为啥要利用ASP.NET AJAX
局地人在收看Pageflakes的时候,首先问作者的标题正是“为啥不选取Protopage可能Dojo库?而是Atlas?”微软的Atlas(已重命名叫ASP.NET
AJAX)是二个充足有前途的AJAX框架。微软为了那么些框架做了重重努力,制作了汪洋可选拔的零部件,那样能够削减你的开荒时间,那样的话,只要相当少的专业量就能够令你的web应用程序有多少个宏观的分界面。它与ASP.NET融合为一,何况包容ASP.NET的Membership和Profile。AJAX
Control
Toolkit
连串包罗了贰20个扩充(译注:未来有三二十个),你能够把它们拖拽到页面上,然后通过安装有个别属性就足以生出特别酷的成效。看看那几个例子你就能够明白ASP.NET
AJAX给大家带来了何等庞大的成效。

2、登陆成功后的回调函数
    function LoginComplete(bool validCredentials, userContext,
methodName)
    ·validCredentials – 是还是不是中标通过了证实
    ·userContext – 用户上下文
    ·methodName – 调用的措施名

在大家中期开垦Pageflakes的时候,Atlas还处在幼儿阶段。大家不得不使用page
method和Web
Service方法来调用Atlas的性状。大家只可以开垦我们休戚与共的拖拽、组件构造、弹出、伸缩/张开等天性。但是未来,Atlas提供了具备这个职能,所以能够大大节约大家的开垦时间。最令人惊讶的是Atlas提供了web
service代理的特色。你能够钦定<script>标签到多少个.asmx文本,然后你会赢得二个JavaScript类,它会依附web
service的概念被科学的转换。这使得加多或移除多少个web
service变得极其轻易,并且你在web
service中加多或移除方法都无需客户端作任何退换。Atlas也提供了众多依据AJAX调用的控件,而且提供了在JavaScript中抓获丰裕相当音讯的特色。服务器端的卓殊能够被准确的抛给客户端的JavaScript代码,你能够捕获它们并格式化这个错误音讯,然后展现给用户。Atlas与ASP.NET
2.0重组起来专门的学问得十一分了不起,完全解除了咬合难点。你无需顾忌page
method和web
service的认证和授权难题,所以能够大大收缩你的客户端代码的开垦量(当然,也多亏因为这么,Atlas运行时也变得不行巨大),绝对于任何的AJAX框架来讲,你可以把越来越多的生气放到本身的代码开荒上来。

3、Sys.Services.AuthenticationService类的logout()方法
    Sys.Services.AuthenticationService.logout(redirectUrl,
logoutCompletedCallback, failedCallback, userContext);
    ·redirectUrl – 注销成功后重定向到的U本田UR-VL
    ·logoutCompletedCallback – 注销成功后的回调函数
    ·failedCallback – 撤销战败后的回调函数
    ·userContext – 用户上下文
    WebService中与其对应的章程 – public void Logout()

Atlas这段时间的版本能够与ASP.NET的Membership、Profile完美的结合,为您提供了在JavaScript中登入和注销的特色,而毫不发postback给服务器,你也足以一向从JavaScript中读取和写入Profile。当你在web应用程序中动用Membership和Profile的时候,那将变得特别轻巧,比如大家做的Pageflakes

4、注销成功后的回调函数
    function LogoutComplete(result, userContext, methodName)
    ·result – 保留字段,大概在后天利用,始终为null
    ·userContext – 用户上下文
    ·methodName – 调用的秘籍名

在Atlas的早些版本中,未有选择HTTP GET调用的方法。全体的调用都以HTTP
POST,所以调用的代价是卓殊大的。近期天,你能够说,哪个调用是HTTP
GET的(而哪些不是)。一旦您使用了HTTP
GET,你就能够运用HTTP响应缓存性子,作者将急迅介绍这一表征。

5、Sys.Services.AuthenticationService类的性质
    ·defaultLoginCompletedCallback – 登陆成功后的回调函数
    ·defaultLogoutCompletedCallback – 注销成功后的回调函数
    ·defaultFailedCallback – 报到或吊销退步后的回调函数
    ·isLoggedIn – 当前用户是或不是业已报到
    ·path – authentication service路径
    ·timeout – 超时时间

批调用并不一定快
ASP.NET
AJAX的CTP版本(从前的本子)里有一个风味,正是允许在多少个伸手里满含多少个央求。它职业时您不会注意到其他工作,并且也不要求写任何特殊的代码。一旦您利用了批调用特色,那么在一遍批调用时期,在那之中具有的web
service调用都会被实施,所以它将缩减回发时间和总响应时间。

6、Sys.Services.ProfileService类的load()方法
    Sys.Services.ProfileService.load(propertyNames,
loadCompletedCallback, failedCallback, userContext);
    ·propertyNames – Profile属性名称数组
    ·loadCompletedCallback – 成功后的回调函数
    ·failedCallback – 退步后的回调函数
    ·userContext – 用户上下文
    Web瑟维斯中与其对应的点子 – public IDictionary<string,
object> GetAllPropertiesForCurrentUser()和public
IDictionary<string, object> GetPropertiesForCurrentUser(string[]
properties)

实在的响应时间只怕回退了,可是我们倍感觉的推迟却变长了。假若有3个web
service被批量调用,那么首先个调用不会初阶完毕,而是兼具3个调用会在同一的大运实现。假使您的每二个web
service调用完了后都更新UI的话,将不会一步一步更新,而是在富有调用一同变成后再一同更新UI。结果,你不拜访到UI被火速更新,而是在UI被更新在此以前有三个长日子的推移。假设说调用中的任何二个(比方第三个调用)下载了多量数额,那么在具备的3个调用完结之前用户不会看出别的变动。所以率先个调用的试行时间大致接近3个调用的总实践时间。就算减弱了实际的一起拍卖时间,然则会以为有更加长的延期。当各类调用都只传输少些数额的时候批调用是那多少个好的,那样,3个小型调用就能够在一回回发中实践完。

7、读取Profile成功后的回调函数
    function onLoadCompleted(numProperties, userContext, methodName)
    ·numProperties – 再次回到的Profile属性个数
    ·userContext – 用户上下文
    ·methodName – 调用的法子名

让大家看看3个调用是什么二个二个被成功的,这将表明那些调用实际上是如何被实施的。
永利会娱乐 1

8、Sys.Services.ProfileService类的save()方法
    Sys.Services.ProfileService.load(propertyNames,
saveCompletedCallback, failedCallback, userContext);
    ·propertyNames – Profile属性名称数组
    ·saveCompletedCallback – 成功后的回调函数
    ·failedCallback – 战败后的回调函数
    ·userContext – 用户上下文
    ·WebService中与其对应的章程 – public int
SetPropertiesForCurrentUser(IDictionary<string, object> values)

其次个调用达到服务端的时刻要比第一个调用长,因为第二个调用吃光了带宽。同样的原原本本的经过,下载也就能花更加多的日子。浏览器同临时间开拓了多少个一而再到劳动器端的连年,所以在同时,只可以管理多少个调用。一旦第三个调用或第二个调用完毕后,第五个调用能力被管理。

9、保存Profile成功后的回调函数
    onSaveCompleted(numProperties, userContext, methodName)
    ·numProperties – 保存的Profile属性个数
    ·userContext – 用户上下文
    ·methodName – 调用的法门名

当3个web service在一遍呼吁中被批调用的时候:
永利会娱乐 2

10、Sys.瑟维斯s.Profile瑟维斯类的质量
    ·读取或安装有个别Profile的习性要那样写 –
Sys.Services.ProfileService.properties.FieldName; 
    ·defaultLoadCompletedCallback – 读取Profile成功后的回调函数
    ·defaultSaveCompletedCallback – 保存Profile成功后的回调函数
    ·defaultFailedCallback – 读取或保存Profile失利后的回调函数
    ·path – profile service路径
    ·timeout – 超时时间

这里一起下载时间将会拥有回退(假诺IIS的滑坡功效启用的话),况且只需一遍网络响应。全数的3个调用一回被发往到服务端后总体实行,组合而成的多个调用的响应是在一回调用中下载。然则对于用户来说,他们会深感速度变慢了,因为UI的换代发生在全部批调用完了今后。那几个批调用完了的总时间总是要善用四个调用的。並且,倘诺你有雅量的贰个又四个的UI更新,IE将会结霜一段时间,那将给用户带来八个不好的体验。一些时候,时间较长的UI更新会招致浏览器出现“白屏”,但是FireFox和Opera不会有此难点。

11、Sys.Services.ProfileGroup类
    ·定义叁个Profile组(同一时候须要在Web.config中定义)

批调用也许有一部分优点的。假诺你的IIS启用了gzip压缩效用的话,将对全部结实开始展览压缩实际不是各自回退每种结果,那么总下载时间长度就能够少于单独调用的下载时间长度。所以,日常批调用都是一对微型调用的话会比较好。不过假诺调用会发送也许重返很大额的话,例如20KB,那么最佳就别使用批调用了。批调用还大概有另一个难点,比如说前四个调用相当的小,第二个调用比十分的大,若是那3个调用被批调用的话,那么前多个小的调用将在延期十分短日子,因为第三个十分的大。

12、登入或吊销退步、读取或保存Profile败北后的回调函数
    function onFailed(error, userContext, methodName)
    ·error – Sys.Net.WebServiceError对象
    ·userContext – 用户上下文
    ·methodName – 调用的点子名

不好的调用会使好的调用超时
要是有五个HTTP调用不知缘何实行了不长的岁月,那么这多个不佳的调用也将会使好的调用超时,同不平日间那多个调用会步向队列。这里就有七个事例:

13、就算要自行调用相关服务来讲,则需求在web.config中的<configuration
/>节点下扩张类似如下的布置

永利会娱乐 3function TestTimeout()
永利会娱乐 4永利会娱乐 5永利会娱乐 6{
永利会娱乐 7    debug.trace(“–Start–“);
永利会娱乐 8    TestService.set_defaultFailedCallback( 
永利会娱乐 9            function(result, userContext, methodName)
永利会娱乐 10永利会娱乐 11    永利会娱乐 12{
永利会娱乐 13        var timedOut = result.get_timedOut();
永利会娱乐 14        if( timedOut )
永利会娱乐 15            debug.trace( “Timedout: ” + methodName );
永利会娱乐 16        else
永利会娱乐 17            debug.trace( “Error: ” + methodName );
永利会娱乐 18    });
永利会娱乐 19    TestService.set_defaultSucceededCallback( function(result)
永利会娱乐 20永利会娱乐 21    永利会娱乐 22{
永利会娱乐 23        debug.trace( result );
永利会娱乐 24    });
永利会娱乐 25    
永利会娱乐 26    TestService.set_timeout(5000);
永利会娱乐 27    TestService.HelloWorld(“Call 1”);
永利会娱乐 28    TestService.Timeout(“Call 2”);
永利会娱乐 29    TestService.Timeout(“Call 3”);
永利会娱乐 30    TestService.HelloWorld(“Call 4”);
永利会娱乐 31    TestService.HelloWorld(“Call 5”);
永利会娱乐 32    TestService.HelloWorld(null); // 那句将变成错误
永利会娱乐 33}

永利会娱乐 34<webServices>
永利会娱乐 35    <authenticationService enabled=”true” requireSSL=”false”/>
永利会娱乐 36    <profileService enabled=”true” 
永利会娱乐 37        readAccessProperties=”Age, Salary”
永利会娱乐 38        writeAccessProperties=”Age, Salary” 
永利会娱乐 39    />
永利会娱乐 40</webServices>

服务端的web service也特别轻易:

示例
AuthenticationService.asmx

永利会娱乐 41[WebService(Namespace = “http://tempuri.org/")\]
永利会娱乐 42[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
永利会娱乐 43[ScriptService]
永利会娱乐 44永利会娱乐 45public class TestService : System.Web.Services.WebService 永利会娱乐 46{
永利会娱乐 47
永利会娱乐 48永利会娱乐 49    public TestService () 永利会娱乐 50{
永利会娱乐 51
永利会娱乐 52        // 要是应用规划的零部件,请取消注释以下行  
永利会娱乐 53        // InitializeComponent(); 
永利会娱乐 54    }
永利会娱乐 55
永利会娱乐 56    [WebMethod][ScriptMethod(UseHttpGet=true)]
永利会娱乐 57永利会娱乐 58    public string HelloWorld(string param) 永利会娱乐 59{
永利会娱乐 60        Thread.Sleep(1000);
永利会娱乐 61        return param;
永利会娱乐 62    }
永利会娱乐 63    
永利会娱乐 64    [WebMethod][ScriptMethod(UseHttpGet=true)]
永利会娱乐 65永利会娱乐 66    public string Timeout(string param) 永利会娱乐 67{
永利会娱乐 68        Thread.Sleep(10000);
永利会娱乐 69        return param;
永利会娱乐 70    }
永利会娱乐 71}

永利会娱乐 72<%@ WebService Language=”C#” Class=”AuthenticationService” %>
永利会娱乐 73
永利会娱乐 74using System;
永利会娱乐 75using System.Web;
永利会娱乐 76using System.Web.Services;
永利会娱乐 77using System.Web.Services.Protocols;
永利会娱乐 78using System.Web.Script.Services;
永利会娱乐 79
永利会娱乐 80[WebService(Namespace = “http://tempuri.org/")\]
永利会娱乐 81[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
永利会娱乐 82[ScriptService]
永利会娱乐 83public class AuthenticationService : System.Web.Services.WebService
永利会娱乐 84永利会娱乐 85永利会娱乐 86{
永利会娱乐 87永利会娱乐 88    /**//// <summary>
永利会娱乐 89    /// 登录
永利会娱乐 90    /// </summary>
永利会娱乐 91    /// <param name=”userName”>用户名</param>
永利会娱乐 92    /// <param name=”password”>密码</param>
永利会娱乐 93    /// <param name=”createPersistentCookie”>是或不是跨浏览器保存认证新闻(持久保留)</param>
永利会娱乐 94    /// <returns></returns>
永利会娱乐 95    [WebMethod]
永利会娱乐 96    public bool Login(string userName, string password, bool createPersistentCookie)
永利会娱乐 97永利会娱乐 98    永利会娱乐 99{
永利会娱乐 100        //Place code here.
永利会娱乐 101
永利会娱乐 102        System.Web.Security.FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
永利会娱乐 103        return true;
永利会娱乐 104    }
永利会娱乐 105
永利会娱乐 106永利会娱乐 107    /**//// <summary>
永利会娱乐 108    /// 注销
永利会娱乐 109    /// </summary>
永利会娱乐 110    [WebMethod]
永利会娱乐 111    public void Logout()
永利会娱乐 112永利会娱乐 113    永利会娱乐 114{
永利会娱乐 115        //Place code here.
永利会娱乐 116    }
永利会娱乐 117}
永利会娱乐 118
永利会娱乐 119

本人调用了服务端的名字为“Timeout”的办法,它不会做任何工作,而只是等待一个较长的日子以使调用超时。之后,小编再调用一个不会晚点的诀窍。然则你猜忌输出的是什么:
永利会娱乐 120

ProfileService.asmx

唯有第三个调用成功了。所以,任何时候假设浏览器的四个一而再都地处拥堵状态以来,那么您愿意的别样调用也都将会晚点。

永利会娱乐 121<%@ WebService Language=”C#” Class=”ProfileService” %>
永利会娱乐 122
永利会娱乐 123using System;
永利会娱乐 124using System.Web;
永利会娱乐 125using System.Web.Services;
永利会娱乐 126using System.Web.Services.Protocols;
永利会娱乐 127using System.Web.Script.Services;
永利会娱乐 128using System.Collections.Generic;
永利会娱乐 129
永利会娱乐 130[WebService(Namespace = “http://tempuri.org/")\]
永利会娱乐 131[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
永利会娱乐 132[ScriptService]
永利会娱乐 133public class ProfileService : System.Web.Services.WebService
永利会娱乐 134永利会娱乐 135永利会娱乐 136{
永利会娱乐 137永利会娱乐 138    /**//// <summary>
永利会娱乐 139    /// 获取用户的全套Profile
永利会娱乐 140    /// </summary>
永利会娱乐 141    /// <returns></returns>
永利会娱乐 142    [WebMethod]
永利会娱乐 143    public IDictionary<string, object> GetAllPropertiesForCurrentUser()
永利会娱乐 144永利会娱乐 145    永利会娱乐 146{
永利会娱乐 147        Dictionary<string, object> dic = new Dictionary<string, object>();
永利会娱乐 148
永利会娱乐 149        dic.Add(“Age”, 27);
永利会娱乐 150        dic.Add(“Salary”, 100);
永利会娱乐 151
永利会娱乐 152        Article article = new Article();
永利会娱乐 153        article.Title = “Article Title From Server”;
永利会娱乐 154        article.PublishTime = DateTime.Now;
永利会娱乐 155
永利会娱乐 156        dic.Add(“Article”, article);
永利会娱乐 157
永利会娱乐 158        return dic;
永利会娱乐 159    }
永利会娱乐 160
永利会娱乐 161永利会娱乐 162    /**//// <summary>
永利会娱乐 163    /// 获取用户的钦赐的Profile
永利会娱乐 164    /// </summary>
永利会娱乐 165    /// <param name=”properties”>属性名称数组</param>
永利会娱乐 166    /// <returns></returns>
永利会娱乐 167    [WebMethod]
永利会娱乐 168    public IDictionary<string, object> GetPropertiesForCurrentUser(string[] properties)
永利会娱乐 169永利会娱乐 170    永利会娱乐 171{
永利会娱乐 172        //Place code here.
永利会娱乐 173        return null;
永利会娱乐 174    }
永利会娱乐 175
永利会娱乐 176永利会娱乐 177    /**//// <summary>
永利会娱乐 178    /// 保存用户的Profile
永利会娱乐 179    /// </summary>
永利会娱乐 180    /// <param name=”values”>用户的Profile的字典数据</param>
永利会娱乐 181    /// <returns></returns>
永利会娱乐 182    [WebMethod]
永利会娱乐 183    public int SetPropertiesForCurrentUser(IDictionary<string, object> values)
永利会娱乐 184永利会娱乐 185    永利会娱乐 186{
永利会娱乐 187        //Place code here.
永利会娱乐 188        return values.Count;
永利会娱乐 189    }
永利会娱乐 190}
永利会娱乐 191
永利会娱乐 192永利会娱乐 193/**//// <summary>
永利会娱乐 194/// Article实体类
永利会娱乐 195/// </summary>
永利会娱乐 196/// <remarks>
永利会娱乐 197/// 示例而已,实际项目中要三番五次自System.Web.Profile.ProfileBase
永利会娱乐 198/// </remarks>
永利会娱乐 199public class Article
永利会娱乐 200永利会娱乐 201永利会娱乐 202{
永利会娱乐 203    private string _title;
永利会娱乐 204永利会娱乐 205    /**//// <summary>
永利会娱乐 206    /// 小说标题
永利会娱乐 207    /// </summary>
永利会娱乐 208    public string Title
永利会娱乐 209永利会娱乐 210    永利会娱乐 211{
永利会娱乐 212永利会娱乐 213        get 永利会娱乐 214{ return _title; }
永利会娱乐 215永利会娱乐 216        set 永利会娱乐 217{ _title = value; }
永利会娱乐 218    }
永利会娱乐 219
永利会娱乐 220    private DateTime _publishTime;
永利会娱乐 221永利会娱乐 222    /**//// <summary>
永利会娱乐 223    /// 文章发表日期
永利会娱乐 224    /// </summary>
永利会娱乐 225    public DateTime PublishTime
永利会娱乐 226永利会娱乐 227    永利会娱乐 228{
永利会娱乐 229永利会娱乐 230        get 永利会娱乐 231{ return _publishTime; }
永利会娱乐 232永利会娱乐 233        set 永利会娱乐 234{ _publishTime = value; }
永利会娱乐 235    }
永利会娱乐 236}
永利会娱乐 237

在Pageflakes的运转中,大家早就大致每一日都从客户端获得400个到600个超时错误报告,大家尚无开掘那是怎么爆发的。起先,我们猜疑是网络连接过慢变成的,可是不也许那样多的用户都发出这种气象。后来,我们猜度是主机提供商的互联网出现了难点。大家做了大气的网络析去发掘标题是不是是出今后网络上,可是我们并没有发觉别的极度。大家使用了SQL
Profiler去搜寻是不是是长日子运作的询问导致了ASP.NET要求实施时的过期。不过不幸,我们最终开采的是,超越三分之一过期错误出现的情状都以先有一对坏的调用,然后好的调用也过期了。所以我们修改了Atlas运维时,引入了机关心珍爱试的功用,难点终于完全消灭了。可是,自动重试须求对ASP.NET
AJAX框架的Javascript做壹回“灵魂口腔科手术”,那一个方法会要求各种调用在逾期后都重试贰次。为了贯彻它,大家必要截获全体web
method调用而且在onFailure回调函数中作个钩,假使战败的缘由是晚点,onFailure将另行调用一样的web
method

Sample.aspx

另二个急需关切的觉察是当大家外骑行览认为艰辛时,想经过饭店或飞机场的有线互连网连接到互连网访谈Pageflakes的时候,第一遍访谈总是不成功,而且存有的web
service调用在率先次尝试中连连败北。直到我们刷新此前都不会职业。那也是我们要贯彻web
service调用当下自行重试的另多个注重原因,它正好能够消除那么些难题。

永利会娱乐 238永利会娱乐 239<%永利会娱乐 240@ Page Language=”C#” MasterPageFile=”~/Site.master” AutoEventWireup=”true” CodeFile=”Sample.aspx.cs”
永利会娱乐 241    Inherits=”ClientScripting_SysServices_Sample” Title=”Sys.Services命名空间下的类” %>
永利会娱乐 242
永利会娱乐 243<asp:Content ID=”Content1″ ContentPlaceHolderID=”ContentPlaceHolder1″ runat=”Server”>
永利会娱乐 244    <div>
永利会娱乐 245        帐号:<input type=”text” id=”txtUserId” /></div>
永利会娱乐 246    <div>
永利会娱乐 247        密码:<input type=”password” id=”txtPassword” /></div>
永利会娱乐 248    <div>
永利会娱乐 249         </div>
永利会娱乐 250    <div>
永利会娱乐 251        <input type=”button” id=”btnLogin” value=”登录” onclick=”btnLogin_click()” />
永利会娱乐 252        <input type=”button” id=”btnLogout” value=”注销” onclick=”btnLogout_click()” /></div>
永利会娱乐 253    <div>
永利会娱乐 254         </div>
永利会娱乐 255    <div>
永利会娱乐 256        年龄:<input type=”text” id=”txtAge” /></div>
永利会娱乐 257    <div>
永利会娱乐 258        薪水:<input type=”text” id=”txtSalary” /></div>
永利会娱乐 259    <div>
永利会娱乐 260        <input type=”button” id=”btnSave” value=”保存Profile” onclick=”btnSave_click()” />
永利会娱乐 261        <input type=”button” id=”btnLoad” value=”读取Profile” onclick=”btnLoad_click()” />
永利会娱乐 262    </div>
永利会娱乐 263    <div>
永利会娱乐 264         </div>
永利会娱乐 265    <div id=”result” />
永利会娱乐 266
永利会娱乐 267永利会娱乐 268    <script type=”text/javascript”>永利会娱乐 269
永利会娱乐 270        var userId;
永利会娱乐 271        var password;
永利会娱乐 272        var login;
永利会娱乐 273        var logout;
永利会娱乐 274        var age;
永利会娱乐 275        var salary
永利会娱乐 276
永利会娱乐 277        function pageLoad()
永利会娱乐 278永利会娱乐 279        永利会娱乐 280{
永利会娱乐 281            userId = $get(“txtUserId”);
永利会娱乐 282            password = $get(“txtPassword”);
永利会娱乐 283            login = $get(“btnLogin”);
永利会娱乐 284            logout = $get(“btnLogout”);
永利会娱乐 285            age = $get(“txtAge”);
永利会娱乐 286            salary = $get(“txtSalary”);
永利会娱乐 287            
永利会娱乐 288            // path – authentication service路径
永利会娱乐 289            $get(“result”).innerHTML = “AuthenticationService path:” + Sys.Services.AuthenticationService.get_path() + “<br />”;
永利会娱乐 290            // timeout – 超时时间
永利会娱乐 291            $get(“result”).innerHTML += “AuthenticationService timeout:” + Sys.Services.AuthenticationService.get_timeout() + “<br />”;
永利会娱乐 292            // path – profile service路径
永利会娱乐 293            $get(“result”).innerHTML += “ProfileService path:” + Sys.Services.ProfileService.get_path() + “<br />”;
永利会娱乐 294            // timeout – 超时时间
永利会娱乐 295            $get(“result”).innerHTML += “ProfileService timeout:” + Sys.Services.ProfileService.get_timeout() + “<br />”;
永利会娱乐 296        }       
永利会娱乐 297                
永利会娱乐 298        function btnLogin_click()
永利会娱乐 299永利会娱乐 300        永利会娱乐 301{
永利会娱乐 302            // defaultLoginCompletedCallback – 登陆成功后的回调函数
永利会娱乐 303            Sys.Services.AuthenticationService.set_defaultLoginCompletedCallback(onLoginCompleted);
永利会娱乐 304            // defaultFailedCallback – 登入或吊销退步后的回调函数
永利会娱乐 305            Sys.Services.AuthenticationService.set_defaultFailedCallback(onFailed);
永利会娱乐 306            
永利会娱乐 307            Sys.Services.AuthenticationService.login
永利会娱乐 308            (
永利会娱乐 309                userId.value, // 用户名
永利会娱乐 310                password.value, // 密码
永利会娱乐 311                false, // 是还是不是跨浏览器保存认证消息(长久保留)
永利会娱乐 312                null, // 保留字段,恐怕在前Smart用
永利会娱乐 313                null, // 登入成功后重定向到的UENVISIONL
永利会娱乐 314                null, // 登入成功后的回调函数
永利会娱乐 315                null, // 登陆战败后的回调函数
永利会娱乐 316                “用户上下文” // 用户上下文
永利会娱乐 317            );
永利会娱乐 318        }
永利会娱乐 319        
永利会娱乐 320        function btnLogout_click()
永利会娱乐 321永利会娱乐 322        永利会娱乐 323{
永利会娱乐 324            // defaultLogoutCompletedCallback – 注销成功后的回调函数
永利会娱乐 325            Sys.Services.AuthenticationService.set_defaultLogoutCompletedCallback(onLogoutCompleted);
永利会娱乐 326            // defaultFailedCallback – 登入或注销退步后的回调函数
永利会娱乐 327            Sys.Services.AuthenticationService.set_defaultFailedCallback(onFailed);
永利会娱乐 328
永利会娱乐 329            Sys.Services.AuthenticationService.logout
永利会娱乐 330            (
永利会娱乐 331                null, // 注销成功后重定向到的URAV4L
永利会娱乐 332                null, // 注销成功后的回调函数
永利会娱乐 333                null, // 注销失利后的回调函数
永利会娱乐 334                null // 用户上下文
永利会娱乐 335            );
永利会娱乐 336        }
永利会娱乐 337        
永利会娱乐 338        function onLoginCompleted(validCredentials, userContext, methodName)
永利会娱乐 339永利会娱乐 340        永利会娱乐 341{
永利会娱乐 342            password.value = “”;
永利会娱乐 343            
永利会娱乐 344            // validCredentials – 是不是中标通过了阐明
永利会娱乐 345            // userContext – 用户上下文
永利会娱乐 346            // methodName – 调用的方法名
永利会娱乐 347            if (validCredentials) 
永利会娱乐 348永利会娱乐 349            永利会娱乐 350{
永利会娱乐 351                userId.value = “”;
永利会娱乐 352                
永利会娱乐 353                $get(“result”).innerHTML = “登陆成功” + “<br />”;
永利会娱乐 354                $get(“result”).innerHTML += “用户上下文:” + userContext + “<br />”;
永利会娱乐 355                $get(“result”).innerHTML += “调用的法子名称叫:” + methodName + “<br />”;
永利会娱乐 356            }
永利会娱乐 357            else
永利会娱乐 358永利会娱乐 359            永利会娱乐 360{
永利会娱乐 361                $get(“result”).innerHTML = “登陆退步” + “<br />”;
永利会娱乐 362            }
永利会娱乐 363            
永利会娱乐 364            // isLoggedIn – 当前用户是还是不是业已报到
永利会娱乐 365            var status = Sys.Services.AuthenticationService.get_isLoggedIn();
永利会娱乐 366            $get(“result”).innerHTML += “登入状态:” + status + “<br />”;
永利会娱乐 367        }
永利会娱乐 368        
永利会娱乐 369        function onFailed(error, userContext, methodName)
永利会娱乐 370永利会娱乐 371        永利会娱乐 372{    
永利会娱乐 373            // error – Sys.Net.WebServiceError对象
永利会娱乐 374            // userContext – 用户上下文
永利会娱乐 375            // methodName – 调用的章程名
永利会娱乐 376            $get(“result”).innerHTML += “错误音信:” + error.get_message() + “<br />”;
永利会娱乐 377        }
永利会娱乐 378        
永利会娱乐 379        function onLogoutCompleted(result, userContext, methodName) 
永利会娱乐 380永利会娱乐 381        永利会娱乐 382{
永利会娱乐 383            // result – 保留字段,可能在以后使用,始终为null
永利会娱乐 384            // userContext – 用户上下文
永利会娱乐 385            // methodName – 调用的章程名
永利会娱乐 386            alert(“成功调用” + methodName) + “<br />”;
永利会娱乐 387        }
永利会娱乐 388        
永利会娱乐 389        
永利会娱乐 390        function btnLoad_click()
永利会娱乐 391永利会娱乐 392        永利会娱乐 393{
永利会娱乐 394            // defaultLoadCompletedCallback – 读取Profile成功后的回调函数
永利会娱乐 395            Sys.Services.ProfileService.set_defaultLoadCompletedCallback(onLoadCompleted);
永利会娱乐 396            // defaultFailedCallback – 读取或保存Profile退步后的回调函数
永利会娱乐 397            Sys.Services.ProfileService.set_defaultFailedCallback(onFailed);
永利会娱乐 398            
永利会娱乐 399            Sys.Services.ProfileService.load
永利会娱乐 400            (
永利会娱乐 401                null, // Profile属性名称数组
永利会娱乐 402                null, // 成功后的回调函数
永利会娱乐 403                null, // 战败后的回调函数
永利会娱乐 404                null // 用户上下文
永利会娱乐 405            );
永利会娱乐 406        }
永利会娱乐 407        
永利会娱乐 408        function btnSave_click()
永利会娱乐 409永利会娱乐 410        永利会娱乐 411{
永利会娱乐 412            // defaultSaveCompletedCallback – 保存Profile成功后的回调函数
永利会娱乐 413            Sys.Services.ProfileService.set_defaultSaveCompletedCallback(onSaveCompleted);
永利会娱乐 414            // defaultFailedCallback – 读取或保存Profile战败后的回调函数
永利会娱乐 415            Sys.Services.ProfileService.set_defaultFailedCallback(onFailed);
永利会娱乐 416            
永利会娱乐 417            Sys.Services.ProfileService.properties.Age = age.value;
永利会娱乐 418            Sys.Services.ProfileService.properties.Salary = salary.value;
永利会娱乐 419            
永利会娱乐 420            // 定义三个Profile组(同临时候供给在Web.config中定义)
永利会娱乐 421            Sys.Services.ProfileService.properties.Article = new Sys.Services.ProfileGroup();
永利会娱乐 422            Sys.Services.ProfileService.properties.Article.Title = “Article Title”;
永利会娱乐 423            Sys.Services.ProfileService.properties.Article.PublishTime = new Date();
永利会娱乐 424
永利会娱乐 425            Sys.Services.ProfileService.save
永利会娱乐 426            (
永利会娱乐 427                null, // Profile属性名称数组
永利会娱乐 428                null, // 成功后的回调函数
永利会娱乐 429                null, // 失利后的回调函数
永利会娱乐 430                null // 用户上下文
永利会娱乐 431            );
永利会娱乐 432        }
永利会娱乐 433        
永利会娱乐 434        function onLoadCompleted(numProperties, userContext, methodName)
永利会娱乐 435永利会娱乐 436        永利会娱乐 437{
永利会娱乐 438            // numProperties – 再次来到的Profile属性个数
永利会娱乐 439            // userContext – 用户上下文
永利会娱乐 440            // methodName – 调用的措施名
永利会娱乐 441            $get(“result”).innerHTML = “通过Profile读取的品质的数额为:” + numProperties.toString() + “<br />”;
永利会娱乐 442            $get(“result”).innerHTML += “Age:” + Sys.Services.ProfileService.properties.Age + “<br />”;
永利会娱乐 443            $get(“result”).innerHTML += “Article Title:” + Sys.Services.ProfileService.properties.Article.Title + “<br />”;    
永利会娱乐 444            $get(“result”).innerHTML += “Article PublishTime:” + Sys.Services.ProfileService.properties.Article.PublishTime.format(“yyyy-MM-dd”) + “<br />”;
永利会娱乐 445        }
永利会娱乐 446
永利会娱乐 447        function onSaveCompleted(numProperties, userContext, methodName)
永利会娱乐 448永利会娱乐 449        永利会娱乐 450{
永利会娱乐 451            // numProperties – 保存的Profile属性个数
永利会娱乐 452            // userContext – 用户上下文
永利会娱乐 453            // methodName – 调用的不二秘技名
永利会娱乐 454            $get(“result”).innerHTML = “通过Profile保存的性子的数目为:” + numProperties.toString() + “<br />”;
永利会娱乐 455        }
永利会娱乐 456    </script>
永利会娱乐 457
永利会娱乐 458</asp:Content>
永利会娱乐 459

此地笔者会告诉您怎么办。Sys$Net$WebServiceProxy$invoke函数是肩负管理全体web
service调用的。所以,我们须要经过二个自定义onFailure回调函数来替换这些函数。只要有不当大概逾期就能够激发这一个自定义回调函数。所以,当有逾期产生的时候,就能再次调用这么些函数,重试就能生出。

ScriptManager的设置

永利会娱乐 460Sys.Net.WebServiceProxy.retryOnFailure = 
永利会娱乐 461    function(result, userContext, methodName, retryParams, onFailure)
永利会娱乐 462永利会娱乐 463永利会娱乐 464{
永利会娱乐 465    if( result.get_timedOut() )
永利会娱乐 466永利会娱乐 467    永利会娱乐 468{
永利会娱乐 469        if( typeof retryParams != “undefined” )
永利会娱乐 470永利会娱乐 471        永利会娱乐 472{
永利会娱乐 473            debug.trace(“Retry: ” + methodName);
永利会娱乐 474            Sys.Net.WebServiceProxy.original_invoke.apply(this, retryParams );
永利会娱乐 475        }
永利会娱乐 476        else
永利会娱乐 477永利会娱乐 478        永利会娱乐 479{
永利会娱乐 480            if( onFailure ) onFailure(result, userContext, methodName);
永利会娱乐 481        }
永利会娱乐 482    }
永利会娱乐 483    else
永利会娱乐 484永利会娱乐 485    永利会娱乐 486{
永利会娱乐 487        if( onFailure ) onFailure(result, userContext, methodName);
永利会娱乐 488    }
永利会娱乐 489}
永利会娱乐 490
永利会娱乐 491Sys.Net.WebServiceProxy.original_invoke = Sys.Net.WebServiceProxy.invoke;
永利会娱乐 492Sys.Net.WebServiceProxy.invoke = 
永利会娱乐 493    function Sys$Net$WebServiceProxy$invoke(servicePath, methodName, useGet, 
永利会娱乐 494        params, onSuccess, onFailure, userContext, timeout)
永利会娱乐 495永利会娱乐 496永利会娱乐 497{   
永利会娱乐 498    var retryParams = [ servicePath, methodName, useGet, params, 
永利会娱乐 499        onSuccess, onFailure, userContext, timeout ];
永利会娱乐 500    
永利会娱乐 501    // 开头调用战败
永利会娱乐 502    // 处理自动重试
永利会娱乐 503    var newOnFailure = Function.createDelegate( this, 
永利会娱乐 504        function(result, userContext, methodName) 
永利会娱乐 505永利会娱乐 506        永利会娱乐 507
永利会娱乐 508            Sys.Net.WebServiceProxy.retryOnFailure(result, userContext, 
永利会娱乐 509                methodName, retryParams, onFailure); 
永利会娱乐 510        } );
永利会娱乐 511        
永利会娱乐 512    Sys.Net.WebServiceProxy.original_invoke(servicePath, methodName, useGet, 
永利会娱乐 513        params, onSuccess, newOnFailure, userContext, timeout);
永利会娱乐 514}

永利会娱乐 515        <asp:ScriptManager ID=”ScriptManager1″ runat=”server”>
永利会娱乐 516            <AuthenticationService Path=”~/ClientScripting/SysServices/AuthenticationService.asmx” />
永利会娱乐 517            <ProfileService Path=”~/ClientScripting/SysServices/ProfileService.asmx” />
永利会娱乐 518        </asp:ScriptManager>
永利会娱乐 519

运作的时候,它将把各样超时调用都重试三次
永利会娱乐 520

Web.config中的相关设置(在<system.web />节点下)

此处你能够见到第一个办法成功了,全部其余超时的调用都会被重试。并且你也会看出重试一回后的调用都工作有成了。产生这种情状是因为在重试中服务端的方法不会做超时管理。所以,这表达了大家的实现格局是金科玉律的。

永利会娱乐 521    <profile enabled=”true”>
永利会娱乐 522      <properties>
永利会娱乐 523        <group name=”Article”>
永利会娱乐 524          <add name=”Title” type=”System.String” />
永利会娱乐 525          <add name=”PublishTime” type=”System.DateTime” />
永利会娱乐 526        </group>
永利会娱乐 527      </properties>
永利会娱乐 528    </profile>
永利会娱乐 529

浏览器只允许同期内有七个调用,此时不会试行另外任何命令
浏览器在同期内只可以对多少个域名管理多个冒出的AJAX调用。倘诺你有5个AJAX调用,那么浏览器首先将会管理三个,然后等内部贰个完事后,再管理另三个调用,直到剩下的4个调用都被成功。其它,你不要期待调用的实行顺序会与您管理调用的一一同样,那是干吗呢?
永利会娱乐 530

运行结果
1、页面加载后
AuthenticationService
path:/Web/ClientScripting/SysServices/AuthenticationService.asmx
AuthenticationService timeout:0
ProfileService path:ProfileService.asmx
ProfileService timeout:0

正如您所见,调用3需求下载非常的大的多少,所以它所需的流年就能够比调用5要长,事实上,调用5会在调用3事施夷光行完。

2、单击“登录”按钮
登陆成功
用户上下文:用户上下文
调用的点子名称叫:Sys.Services.AuthenticationService.login
报到状态:true

之所以,在HTTP的社会风气里,这个都以不足预感的。

3、单击“注销”按钮
弹出框,消息:成功调用Sys.Services.AuthenticationService.logout

当队列里有多于多少个调用的时候浏览器将不会响应
品味这样做,在第壹遍访谈时张开任何三个加载了汪洋奥迪Q5SS的页(如Pageflakes,
Netvibes,
Protopage),在加载时期,你能够品味着单击贰个链接到另三个站点如故试着直接访谈另二个站点,那么您就能够意识浏览器不会有其余响应。直到浏览器里有所队列的AJAX调用都成功之后,浏览器本事经受另二个活动。那是IE的多少个相比不佳的地点,不过Firefox和Opera就不会有此难题。

4、单击“保存Profile”按钮
因而Profile保存的质量的数量为:4

以此问题是,当您有恢宏的AJAX调用的时候,浏览器会将有着的调用放到二个队列里,在同期内只进行在那之中的五个。所以,若是您单击了有个别链接或许转载另贰个站点,那么浏览器必须等待在得到另三个调用以前正在推行的调用达成今后才会去管理。化解这几个主题素材的办法正是制止浏览器在同一时候内有多于八个的调用在队列里。大家需求保障一个谈得来的系列,然后从我们的行列里将三个贰个调用的发到浏览器的队列中。

5、单击“读取Profile”按钮
经过Profile读取的习性的数目为:3
Age:27
Article Title:Article Title From Server
Article PublishTime:2007-07-12

这几个化解方案是很棒,它能够免止调用间的争辩:

OK [源码下载]

永利会娱乐 531永利会娱乐 532var GlobalCallQueue = 永利会娱乐 533{
永利会娱乐 534    _callQueue : [],    // 保存web method的调用列表
永利会娱乐 535    _callInProgress : 0,    // 浏览器如今拍卖的web method的号码
永利会娱乐 536    _maxConcurrentCall : 2, // 同不常候内试行调用的最大数
永利会娱乐 537    _delayBetweenCalls : 50, // 调用施行之间的延迟
永利会娱乐 538    call : function(servicePath, methodName, useGet, 
永利会娱乐 539        params, onSuccess, onFailure, userContext, timeout)
永利会娱乐 540永利会娱乐 541    永利会娱乐 542{
永利会娱乐 543        var queuedCall = new QueuedCall(servicePath, methodName, useGet, 
永利会娱乐 544            params, onSuccess, onFailure, userContext, timeout);
永利会娱乐 545
永利会娱乐 546        Array.add(GlobalCallQueue._callQueue,queuedCall);
永利会娱乐 547        GlobalCallQueue.run();
永利会娱乐 548    },
永利会娱乐 549    run : function()
永利会娱乐 550永利会娱乐 551    永利会娱乐 552{
永利会娱乐 553        /// 从队列里举办一个调用
永利会娱乐 554        
永利会娱乐 555        if( 0 == GlobalCallQueue._callQueue.length ) return;
永利会娱乐 556        if( GlobalCallQueue._callInProgress < 
永利会娱乐 557            GlobalCallQueue._maxConcurrentCall )
永利会娱乐 558永利会娱乐 559        永利会娱乐 560{
永利会娱乐 561            GlobalCallQueue._callInProgress ++;
永利会娱乐 562            // 得到第叁个调用队列
永利会娱乐 563            var queuedCall = GlobalCallQueue._callQueue[0];
永利会娱乐 564            Array.removeAt( GlobalCallQueue._callQueue, 0 );
永利会娱乐 565            
永利会娱乐 566            // 调用web method
永利会娱乐 567            queuedCall.execute();
永利会娱乐 568        }
永利会娱乐 569        else
永利会娱乐 570永利会娱乐 571        永利会娱乐 572{
永利会娱乐 573            // 达到最大并发数,无法运作另一个调用
永利会娱乐 574    // 管理中的webservice method
永利会娱乐 575        }
永利会娱乐 576    },
永利会娱乐 577    callComplete : function()
永利会娱乐 578永利会娱乐 579    永利会娱乐 580{
永利会娱乐 581        GlobalCallQueue._callInProgress –;
永利会娱乐 582        GlobalCallQueue.run();
永利会娱乐 583    }
永利会娱乐 584};
永利会娱乐 585
永利会娱乐 586QueuedCall = function( servicePath, methodName, useGet, params, 
永利会娱乐 587    onSuccess, onFailure, userContext, timeout )
永利会娱乐 588永利会娱乐 589永利会娱乐 590{
永利会娱乐 591    this._servicePath = servicePath;
永利会娱乐 592    this._methodName = methodName;
永利会娱乐 593    this._useGet = useGet;
永利会娱乐 594    this._params = params;
永利会娱乐 595    
永利会娱乐 596    this._onSuccess = onSuccess;
永利会娱乐 597    this._onFailure = onFailure;
永利会娱乐 598    this._userContext = userContext;
永利会娱乐 599    this._timeout = timeout;
永利会娱乐 600}
永利会娱乐 601
永利会娱乐 602QueuedCall.prototype = 
永利会娱乐 603永利会娱乐 604永利会娱乐 605{
永利会娱乐 606    execute : function()
永利会娱乐 607永利会娱乐 608    永利会娱乐 609{
永利会娱乐 610        Sys.Net.WebServiceProxy.original_invoke( 
永利会娱乐 611            this._servicePath, this._methodName, this._useGet, this._params,  
永利会娱乐 612            Function.createDelegate(this, this.onSuccess), // 调用处理到位
永利会娱乐 613            Function.createDelegate(this, this.onFailure), // 调用管理到位
永利会娱乐 614            this._userContext, this._timeout );
永利会娱乐 615    },
永利会娱乐 616    onSuccess : function(result, userContext, methodName)
永利会娱乐 617永利会娱乐 618    永利会娱乐 619{
永利会娱乐 620        this._onSuccess(result, userContext, methodName);
永利会娱乐 621        GlobalCallQueue.callComplete();            
永利会娱乐 622    },        
永利会娱乐 623    onFailure : function(result, userContext, methodName)
永利会娱乐 624永利会娱乐 625    永利会娱乐 626{
永利会娱乐 627        this._onFailure(result, userContext, methodName);
永利会娱乐 628        GlobalCallQueue.callComplete();            
永利会娱乐 629    }        
永利会娱乐 630};

QueueCall封装了八个web
method调用,它具备真正web服务调用的有着参数,况兼重写了onSuccess和onFailure回调函数。我们想掌握当七个调用完毕也许退步了的时候,怎么着从大家的行列里调出另一个调用。GlobalCallQueue保存了web服务调用的列表。无论几时,当三个web
method被调用时,大家先要对GlobalCallQueue中的调用进行排队,并从大家自身的行列里三个三个的实践调用。那样就可以确定保障浏览器在一直以来的日子里不会有多于八个的调用,所以浏览器就不会停下响应。

为了确认保障加利亚队列是依据调用的,大家要求像在此以前那么再一次重写ASP.NET AJAX的web
method

永利会娱乐 631Sys.Net.WebServiceProxy.original_invoke = Sys.Net.WebServiceProxy.invoke;
永利会娱乐 632Sys.Net.WebServiceProxy.invoke = 
永利会娱乐 633    function Sys$Net$WebServiceProxy$invoke(servicePath, methodName, 
永利会娱乐 634        useGet, params, onSuccess, onFailure, userContext, timeout)
永利会娱乐 635永利会娱乐 636永利会娱乐 637{   
永利会娱乐 638    GlobalCallQueue.call(servicePath, methodName, useGet, params, 
永利会娱乐 639        onSuccess, onFailure, userContext, timeout);
永利会娱乐 640}

在浏览器中缓存web服务响应得以一望而知节省带宽
浏览器可以在用户的硬盘里缓存图片、JavaScript、CSS文件,假诺XML
HTTP调用是一个HTTP
GET的话也是能够缓存的。这些缓存是基于UPRADOL的。假如是一样U揽胜极光L,且保存在同一个Computer里,那么数量将从缓存里加载,而不会向服务器再度恳请。基本上,浏览器能够缓存任何HTTP
GET央求而且重回基于U普拉多L的被缓存数据。要是您把多个XML HTTP调用作为HTTP
Get格局的话,那么服务端将重返一些特有的头信息,用于公告浏览器对相应做缓存,之后再度调用一样的剧情,结果就能够应声从缓存中被重返,进而减弱了互连网传输延迟和下载时间。

在Pageflakes中,大家对用户的气象做了缓存,所以当用户再度拜望的时候会从浏览器的缓存里及时赢得缓存数据,而不用经过服务端。由此第4回加载时间会变得特别快。咱们也缓存了用户的少数行为所发生的结果。当用户再度做同样行为时,缓存结果就能应声从用户的地点缓存中加载,进而缩短了互联网传输时间。用户会体会到二个急忙加载和高响应的站点,得到速度会有综上可得抓实。

本条方法正是拍卖Atlas web service调用时要使用HTTP
GET格局,并且要回到一些显眼的HTTP头信息报告浏览器械体要缓存多久。如若在响应时期你回来了叁个“Expires”头消息,那么浏览器就能缓存这些XML
HTTP结果。这里您须求回到七个头信息去通告浏览器缓存结果。

永利会娱乐 641HTTP/1.1 200 OK 
永利会娱乐 642Expires: Fri, 1 Jan 2030 
永利会娱乐 643Cache-Control: public

该信息将通知浏览器要缓存结果直到2030年10月1日。在你管理具备同样参数的同二个XML
HTTP调用的时候,就将从Computer的缓存中加载数据,而不会通过服务端。这里还或者有愈来愈多的支配缓存的高端方法。举个例子,有二个头新闻文告浏览器缓存60秒,那么浏览器要在60秒现在技艺接触到服务端并获取新的结果。当60秒后浏览器本地缓存过期的时候,它也会制止从代理服务器端获得已缓存的响应。

永利会娱乐 644HTTP/1.1 200 OK 
永利会娱乐 645Cache-Control: private, must-revalidate, proxy-revalidate, max-age=60

让我们来尝试着在五个ASP.NET web service方法中生出那样的头新闻:

永利会娱乐 646[WebMethod][ScriptMethod(UseHttpGet=true)]
永利会娱乐 647public string CachedGet()
永利会娱乐 648永利会娱乐 649永利会娱乐 650{
永利会娱乐 651    TimeSpan cacheDuration = TimeSpan.FromMinutes(1);
永利会娱乐 652    Context.Response.Cache.SetCacheability(HttpCacheability.Public);
永利会娱乐 653    Context.Response.Cache.SetExpires(DateTime.Now.Add(cacheDuration));
永利会娱乐 654    Context.Response.Cache.SetMaxAge(cacheDuration);
永利会娱乐 655    Context.Response.Cache.AppendCacheExtension(
永利会娱乐 656           “must-revalidate, proxy-revalidate”);
永利会娱乐 657
永利会娱乐 658    return DateTime.Now.ToString();
永利会娱乐 659}

结果便是下列头音讯:
永利会娱乐 660

“Expires”头消息被科学的设置。但是难题发生在“Cache-Control”,它显示了“max-age”的值被设置成零,这将阻碍浏览器从另外缓存中读取数据。假设你真正想禁止使用缓存,当然要发送那样一条Cache-Control头音讯。结果疑似产生了反而的事务。

出口的结果依旧仍然是错的,并从未被缓存
永利会娱乐 661

不能够更换“max-age”头新闻是ASP.NET
2.0中的bug。因为“max-age”被设置成零,而“max-age”的值等于零就代表不供给缓存,所以ASP.NET
2.0才把“Cache-Control”设置为“private”。所以使ASP.NET
2.0重回正确的缓存响应的头新闻是不可行的。

简短节说。反编写翻译HttpCachePolicy类(Context.Response.Cache对象的类)之后,作者发觉了如下代码:
永利会娱乐 662

不知怎么,this._maxAge的值会被设置成零,看一下这段代码“if
(!this._isMaxAgeSet || (delta <
this._maxAge))”,它用来幸免_maxAge被设置得过大。由于这一个难点,大家需绕过Set马克斯Age函数,然后使用反射去一贯的装置_maxAge的值。

永利会娱乐 663[WebMethod][ScriptMethod(UseHttpGet=true)]
永利会娱乐 664public string CachedGet2()
永利会娱乐 665永利会娱乐 666永利会娱乐 667{
永利会娱乐 668    TimeSpan cacheDuration = TimeSpan.FromMinutes(1);
永利会娱乐 669
永利会娱乐 670    FieldInfo maxAge = Context.Response.Cache.GetType().GetField(“_maxAge”, 
永利会娱乐 671        BindingFlags.Instance|BindingFlags.NonPublic);
永利会娱乐 672    maxAge.SetValue(Context.Response.Cache, cacheDuration);
永利会娱乐 673
永利会娱乐 674    Context.Response.Cache.SetCacheability(HttpCacheability.Public);
永利会娱乐 675    Context.Response.Cache.SetExpires(DateTime.Now.Add(cacheDuration));
永利会娱乐 676    Context.Response.Cache.AppendCacheExtension(
永利会娱乐 677            “must-revalidate, proxy-revalidate”);
永利会娱乐 678
永利会娱乐 679    return DateTime.Now.ToString();
永利会娱乐 680}

它将重临下列头消息:
永利会娱乐 681

方今“max-age”被设置成了60,所以浏览器将把数据缓存60秒。假如60秒内你使用了平等的调用,那么它将赶回一样的结果。上边是一个来得从服务端重返日期的输出结果:
永利会娱乐 682

1分钟后,缓存过期并且浏览器再度向服务器发送八个诉求。客户端代码如下:

永利会娱乐 683function testCache()
永利会娱乐 684永利会娱乐 685永利会娱乐 686{
永利会娱乐 687    TestService.CachedGet(function(result)
永利会娱乐 688永利会娱乐 689    永利会娱乐 690{
永利会娱乐 691        debug.trace(result);
永利会娱乐 692    });
永利会娱乐 693}

这里还可能有另三个题目亟需消除。在web.config文件中,你会看到ASP.NET
AJAX增添了下边这一个成分:

永利会娱乐 694<system.web>
永利会娱乐 695        <trust level=”Medium”/>

它会防止大家设置响应对象的_maxAge,因为它供给反射。所以您无法不删除trust成分大概安装它的level属性为Full

永利会娱乐 696<system.web> 
永利会娱乐 697    <trust level=”Full”/>

当“this”不是您感到的“this”的时候
Atlas回调函数不会在它们被调用的同等上下文中实行。比如,倘若您在多个JavaScript类里像那样使用三个web method

永利会娱乐 698function SampleClass()
永利会娱乐 699永利会娱乐 700永利会娱乐 701{
永利会娱乐 702    this.id = 1;
永利会娱乐 703    this.call = function()
永利会娱乐 704永利会娱乐 705    永利会娱乐 706{
永利会娱乐 707        TestService.DoSomething( “Hi”, function(result)
永利会娱乐 708永利会娱乐 709        永利会娱乐 710{
永利会娱乐 711            debug.dump( this.id );
永利会娱乐 712        } );
永利会娱乐 713    }
永利会娱乐 714}

当你调用“call”方法的时候会生出什么样?你会在debug中获取“1”吗?不会,你将在debug中收获“null”,因为那几个“this”不再是类的实例。那是每一人平时会犯的错误。那在Atlas的文书档案里照旧没有有关表明,作者发掘比相当多开垦人士都耗时去搜索那是怎么样错误。

缘由是这么的。大家领会借使JavaScript事件被触发,那么“this”正是指点致事件发生的那么些HTML成分,所以借令你像上面那样写的话:

永利会娱乐 715function SampleClass()
永利会娱乐 716永利会娱乐 717永利会娱乐 718{
永利会娱乐 719    this.id = 1;
永利会娱乐 720    this.call = function()
永利会娱乐 721永利会娱乐 722    永利会娱乐 723{
永利会娱乐 724        TestService.DoSomething( “Hi”, function(result)
永利会娱乐 725永利会娱乐 726        永利会娱乐 727{
永利会娱乐 728            debug.dump( this.id );
永利会娱乐 729        } );
永利会娱乐 730    }
永利会娱乐 731}
永利会娱乐 732
永利会娱乐 733<input type=”button” id=”ButtonID” onclick=”o.onclick” />

要是您单击了那一个开关,就能发觉“ButtonID”取代了“1”。原因便是其一开关正在调用“call”方法。所以,这一个调用在开关对象的上下文中完毕,而“this”就被映射为那几个开关对象。

一模二样的,当XML
HTTP触发了能够捕获和激情回调函数的onreadystatechanged事件的时候,代码试行依旧在XML
HTTP的光景文中。它是接触了那个事件的XML
HTTP对象。结果,“this”就针对了XML
HTTP对象,实际不是你和谐的在回调函数被申明处的类。

为了使回调函数在类的实例的内外文中激发,所以要让“this”指向类的实例,你须要做如下更换。

永利会娱乐 734function SampleClass()
永利会娱乐 735永利会娱乐 736永利会娱乐 737{
永利会娱乐 738    this.id = 1;
永利会娱乐 739    this.call = function()
永利会娱乐 740永利会娱乐 741    永利会娱乐 742{
永利会娱乐 743        TestService.DoSomething( “Hi”, 
永利会娱乐 744            Function.createDelegate( this, function(result)
永利会娱乐 745永利会娱乐 746        永利会娱乐 747{
永利会娱乐 748            debug.dump( this.id );
永利会娱乐 749        } ) );
永利会娱乐 750    }
永利会娱乐 751}

这里的Function.createDelegate用来创立二个调用“this”上下文下的一定函数的嘱托。它能够给函数提供“this”的上下文。Function.createDelegate被定义在Atlas运维时。

永利会娱乐 752永利会娱乐 753Function.createDelegate = function(instance, method) 永利会娱乐 754{
永利会娱乐 755永利会娱乐 756    return function() 永利会娱乐 757{
永利会娱乐 758        return method.apply(instance, arguments);
永利会娱乐 759    }
永利会娱乐 760}

HTTP POST要比HTTP GET慢,不过ASP.NET AJAX暗许用的是HTTP POST
暗中同意情形下,ASP.NET AJAX的兼具web service调用都选取HTTP POST格局。HTTP
POST格局要比HTTP
GET格局提交越来越多的代价,它经过互联网传输更加多的字节,由此将在占用宝贵的网络传输时间,也使得ASP.NET要在服务端做一些外加管理。所以,在大概的情形下你应当利用HTTP
GET情势。可是,HTTP
GET情势不允许你将对象作为参数字传送输,你不得不传输数字、字符串和日期。当你管理一个HTTP
GET调用的时候,Atlas会协会贰个被编码的U奇骏L并利用它。所以,你不该传输相当多剧情而使ULANDL超越20五十个字符。据作者近些日子所知,那是别的UEscortL的最大尺寸。

为了在二个web service方法中利用HTTP
GET形式,你供给用[ScriptMethod(UseHttpGet=true)]质量修饰那一个措施:

永利会娱乐 761[WebMethod] [ScriptMethod(UseHttpGet=true)] 
永利会娱乐 762public string HelloWorld()
永利会娱乐 763永利会娱乐 764永利会娱乐 765{
永利会娱乐 766}

POST与GET的另七个标题是,POST须要两遍互联网传输。当您选取POST的时候,web服务器会首发送三个“HTTP
100
Continue”,那表示web服务器已经希图好了抽取内容。之后,浏览器才会发送实际数据。所以,因为POST央浼的始发阶段要比GET格局开支更加多的大运,在AJAX程序里互联网延迟(你的计算机和服务器之间的多寡传输)是要授予丰富器重的,因为AJAX适合管理部分小的急需在微秒级的小时内造成的调用。不然程序会不流利并且让用户以为嫌恶。

Ethereal是二个很好的工具,它能够侦测到POST和GET的情况下到底发生了怎么:
永利会娱乐 767

从地方的图中,你能够看看POST格局在备选发送实际数据以前,要从web服务器乞请一段“HTTP
100
Continue”的承认消息,那之后才会传输数据。另一方面,GET格局传输数据是无需任何确认的。

为此,当你要从服务端下载页的某一部分、一个报表也许是一段文本之类的时候就应当使用HTTP
GET格局。而一旦要像web
form那样以提交的法子发送数据到服务端的话就不应有运用HTTP GET格局。

结论
地点所说的这几个高级技艺都早就在Pageflakes中落到实处了,这里自身并未聊起它的详尽达成格局,然则原理都关涉了,所以,你能够放心地利用那几个本领。那么些手艺将节约你化解难题的时光,或者在付出碰着中您一直没认知到那一个难点,不过当您科学普及布署网站之后,来自世界各州的访谈者就将直面这一个标题。一开头就理之当然的完毕这么些技巧将会大大节省你的开拓和客户补助的小时。请同不时间关怀作者的博客以获得越多的手艺。

相关文章