在ASP.NETAtlas中调用WebService—批量调用以提高效率
来源:互联网 发布:天涯明月刀男脸型数据 编辑:程序博客网 时间:2024/06/01 14:09
对于Atlas程序,在某些情况下,我们需要在短时间内调用大量的Web Service,例如某个列表中用户快速的点击删除。这时网络带宽,稳定程度等等往往会造成较长时间的延迟。如果可以将这些调用包装成一个单一的请求,那么用户只需忍受一次网络延迟,即可得到处理的结果,也间接的提高了效率。似乎这并不是一个很容易实现的功能,但幸运的是,Atlas中内建了对批量调用Web Service的支持,您所需要的只是在程序中简单设置一下。
Atlas中每个Web Service的调用请求都有三个优先级:0:高,1:中,2:低,默认值为中。
在调用的时候您可以通过priority参数(请参考:在ASP.NET Atlas中调用Web Service——处理错误,超时以及响应用户的取消操作)指定本次调用的优先级。对于高优先级的调用,Atlas并不应用批量调用,每次都会立即发送该请求;对于中和低优先级的调用,Atlas会将一定时间(请参考下面WebRequestManager的介绍)内的调用包装成一个单独的请求一起发送,或是当待调用的请求达到指定数目(请参考下面WebRequestManager的介绍)时一起发送。其中如果待调用的请求太多,那么会从中挑选中优先级的请求首先调用。
启用Atlas内建的批量调用Web Service支持,您首先需要在web.config中注册服务器端处理批量调用的handler(默认的Atlas Web Site Template已经启用了这个handler):
<httpHandlers>
<add verb="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" validate="false"/>
</httpHandlers>
然后在页面的Atlas XML脚本中加入对WebRequestManager的显示声明并设定该页面允许对Web Service的批量调用: <script type="text/xml-script">
<page xmlns:script="http://schemas.microsoft.com/xml-script/2005">
<components>
<webRequestManager batchSize="5" enableBatching="true" batchDelay="3000" />
</components>
</page>
</script>
这里您需要注意的是WebRequestManager的如下三个属性:
enableBatching:设定该页面是否允许批量调用,默认值为false。这里我们应该设置为true。
batchSize:设定一次批量调用中包含的请求的最大数量,默认值为5。当待调用的请求超过这个设定时,即使未达到batchDelay中的设定时限,也立刻发出该批量请求。
batchDelay:设定一次批量调用的等待时限。默认值为1000(毫秒)。当等待时限超过这个设定时,即使未达到batchSize中的请求数量,也立刻发出该批量请求。
如此设定后,页面中的每一个Web Service请求都会应用批量调用。所以,对于单独的一次调用,您应该将其优先级指定为高。
让我们来看一个实例,首先编写一个Web Service,其中有下述Web Method,两个参数分别代表该任务的顺序(这样我们可以分清任务执行的顺序)以及优先级:
[WebMethod]
public string DoTask(int taskID, int priority)
{
if (priority < 0 || priority > 2)
throw new Exception("priority can only be 0, 1 or 2!");
return string.Format("Task (ID: {0}, Priority: {1}) finished.", taskID, priority);
}
然后按照开头部分代码在web.config中启用批量调用,并在页面上添加WebRequestManager,不要忘了页面上还需要一个ScriptManager,引用上面定义的Web Service: <atlas:ScriptManager ID="scriptManager" runat="server">
<Services>
<atlas:ServiceReference Path="SampleService.asmx" />
</Services>
</atlas:ScriptManager>
添加HTML标记。其中按钮用来引发批量调用,div用来显示调用结果:
<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return invokeTasks_onclick()" />
<div id="result"/>
最后是javascript脚本,调用Web Service:
function invokeTasks_onclick()
{
// clear the output
$('result').innerHTML = '';
DoTask(1, 2);
DoTask(1, 1);
DoTask(2, 0);
}
var taskID = 0;
function DoTask(times, priority)
{
for (var i = 0; i < times; i)
{
SampleService.DoTask(
taskID ,
priority,
{onMethodComplete: OnComplete, priority: priority }
);
}
}
function OnComplete(result)
{
$('result').innerHTML = result "<br />";
}
注意到DoTask()方法接受两个参数:times用来指定调用次数,priority用来指定优先级,并且我们利用了一个全局的变量taskID用来维护一个自增的请求顺序。
在这个示例中,我们首先调用了一个低优先级的请求,然后一个中优先级的,最后两个高优先级的。
由于高优先级不参与批量调用,所以您最先看到的是它们的返回:
由于中低优先级的总数为2个,尚未达到5,所以在3000毫秒的延时过后才被发送:
您可以修改invokeTasks_onclick()方法中的调用顺序以及调用数目,分析批量调用的实现方式。
该示例程序可以在此下载:http://www.cnblogs.com/Files/dflying/BatchingCallsDemo.rar
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>- 在ASP.NETAtlas中调用WebService—批量调用以提高效率
- 在ASP.NETAtlas中调用WebService——创建Mashup调用远端WebService(GoogleSearch实例)
- 在ASP.NETAtlas中调用WebService—创建Mashup调用远端WebService(Yahoo!天气实例)
- 在ASP.NETAtlas中调用WebService—直接在ASPX页面上暴露WebMethod
- 在ASP.NETAtlas中调用WebService—应用Cache减小服务器开销
- 在ASP.NETAtlas中调用WebService—处理错误,超时以及响应用户的取消操作
- 在VB6或ASP中调用webservice
- 在VB6或ASP中调用webservice
- 在VB6或ASP中调用webservice
- 在VB6或ASP中调用webservice
- ASP.NET中调用WebService
- 在JavaScript中调用WebService
- 在JavaScript中调用WebService
- 在SQLserver2005中调用webservice
- 在VC中调用 WebService
- 在VC中调用 WebService
- 在VC中调用 WebService
- 在Android中调用WebService
- 实施SOA可能面临的危机与机遇
- ASP.NET基于角色的窗体安全认证机制
- 关于asp.net1.0升级到asp.net2.0时发现的一个有趣的问题
- ASP.NET中文件上传下载方法集合
- bcp将本地txt文本导入远程sqlserver中,本地未装sqlserver
- 在ASP.NETAtlas中调用WebService—批量调用以提高效率
- ASP.NET2.0中配合MasterPage使用的优化CSS模型
- SOA架构暴露固有缺陷 CIO应时刻警惕
- ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
- Effective Using LINQ To SQL (1) - 分頁技巧
- asp.net水晶报表-主从表关联问题
- 由于未处理服务器端代码而导致ASP.NET页出现意外情况
- 对asp.net1.1开发模板类的一些修改说明
- SOA的模型行为