页面前台通过JS访问WEB SERVICES,以及如何处理返回结果.

 首先说一下,这个问题和AJAX难以分开.其实现方法和AJAX非常类似.有AJAX经验的朋友就很容易理解.

我这里举例的项目没有直接使用MS的AJAX框架而是只引用了该框架中的一个关键DLL和两段脚本.下边我会清楚的说明JS访问WEB SERVICES的具体流程.

首先:准备一个SERVICE,在SERVICE中要加上下边两个引用.

using System.Web.Script.Services;
using System.Web.Script.Serialization;
这两个引用自System.Web.Extensions.dll
没有的话去MS下载, 在MS的AJAX包中就包含

SERVICE.CS代码中
[ScriptService]
public class ElmService : System.Web.Services.WebService
{
  [WebMethod(EnableSession = true)]
    public string GetElm(string inComType, string inActElmID, string inEftElmsID, string inParamList)
    {

         …………

    }
}

//注意[ScriptService]这个标记  /JS请求就是靠这个标记才输出脚本 脚本内容是对服务的类和方法以及返回结构的封装

第二:在页面上加上三个脚本

脚本A:<script src='script/AJAXSERVICE.js' type='text/javascript'></script>//这个脚本是MS对.NET基本类型和方法的JS版封装,我自己提取出来的,如果页面使用了MS.AJAX框架那么这个JS就已经存在了,不用手动添加了,下边有专门解释。

脚本B:<script src='ElmService.asmx/js' type='text/javascript'></script>//这个是SERVICE自动生成的,[ScriptService]的功劳。

脚本C:<script src='scritp/myservice.js' type='text/javascript'></script>//这个是自己写的脚本,具体的使用服务返回结果的代码。根据业务需要自己写。

在B中,已经有了一个JS对象ElmService和JS方法ElmService.GetElm( inComType, inActElmID, inEftElmsID, ceparamlist, CE_ShowResult, CE_ShowError);
我们看到这个JS方法中的参数和SERVICE代码中的参数基本一样,但是多了两个。这两个其实是方法名。这两个方法是需要我们在脚本C中手写的。分别处理调用服务后正常的返回结果,或者处理调用失败、超时、异常等情况。

脚本C中我们写了这两个方法。

function CE_ShowError( inError) //处理调用SERVICE超时或者处理错误结果
{
    alert("服务请求出现错误,也许是因为您的网络出现问题。/r/n您可以稍后再试一次,或者检查您的网络。/r/n The Request has some error, may be your network has some problem. /r/n You can try it later, or cheak your network.");
    alert("ErrorMessage:"+inError.get_message());
    CE_ShowResultDo(); 
}
function CE_ShowResult( inServiceResult)// 处理SERVICE返回的正常结果.
{
    var tmpstrkk=inServiceResult.replace("<?xml version=/"1.0/" encoding=/"utf-8/" ?>","").replace("<string xmlns=/"
http://tempuri.org//">" ,"").replace("</string>" ,"");
    var ce_ResultBodyArray=CE_GetResultArray(tmpstrkk);
    for (p=0;p<CE_EftElmsIDandHTML.length;p++)
    {
        for (q=0;q<ce_ResultBodyArray.length;q++)
        {
            var tmpidkk=CE_EftElmsIDandHTML[p].ElmID;
            var tmpidkkk=ce_ResultBodyArray[q].ElmID;
            if (tmpidkk.toUpperCase()==tmpidkkk.toUpperCase())
            {
                 CE_EftElmsIDandHTML[p].ElmHTML=ce_ResultBodyArray[q].ElmHTML;
            } 
        }
       
    }
    CE_ShowResultDo();  
}

第三:我们自己的事件触发SERVICE调用

比如我们有个按扭,ONCLICK="DoService();"

我们脚本C中当然要有DoService()方法

function DoService()

{

  var inComType="Com1";  var inActElmID="Elm1";  inEftElmsID="Elm1,Elm2"; ceparamlist="abc=1,bcd=3";

  ElmService.GetElm( inComType, inActElmID, inEftElmsID, ceparamlist, CE_ShowResult, CE_ShowError);

}

大家看到了,这里调用GETELM方法是没有返回结果的。SERVICE的返回结果是通过"成功方法" CE_ShowResult来返回的。

根据我们以前的定义function CE_ShowResult( inServiceResult)

inServiceResult就是返回结果了。当SERVICE的返回类型很简单,数字、字符串等返回类型的时候,我们可以直接JS中使用,因为JS是弱类型嘛。可如果返回的是复杂类型数据呢? 现在该我们的脚本A大显身手了。

先说下脚本B,脚本B中不仅仅是SERVICE的类型,还包括返回值类型的封装。但是我们知道在SERVICE中.NET类型和JS中的类型有很大差距的。所以脚本B也要用基本类型来构建我们的结果类型。它是根据什么基本类型实现呢?就是脚本A的内容。脚本A中把.NET的基本数据类型用JS封装了一遍(MS就是牛B)。

比如脚本A中的 int类型就包括了比JS中数字类型更丰的方法,而且命名规则和.NET环境中一样。DateTime类型也提供了与.NET环境中一样的方法,比如 DateTime.ToShotTimeString()方法。  这样我们使用和处理SERVICE返回的复杂数据类型就可以很方便的使用了。

如SERVICE.CS中返回的数据类型是

public class aabb
{
  public string name;
  public DateTime SiTime;
  public int count;
}

那么我们在JS脚本 function CE_ShowResult( inServiceResult) 中就可以写这样的代码:

var res=inServiceResult.name+"_"+inServiceResult.count.ToString()+"_"+inServiceResult.SiTime.ToLongDateString();

 

顺便说一下在失败处理函数中 inError.get_message() 这也是在脚本B中封装的。

更多的具体高级处理方法和事件,大家可以仔细研究下脚本B和脚本A

脚本A是通过MS的AJAX框架导出的。它本身封在DLL内。

大家可以自己MS.AJAX作一个简单站点,然后查看页面显示出来的代码,把这个JS导出来。稍后我也会把这个文件传到CSDN上来。

 

第四:

希望大家早日能作出一个全站SERVICE加JS的新型站点。这样的站点比AJAX要快,而且服务压力会小的多的多。

……

本来还有个问题想说明一下,现在脑子不好使想不起来了。我想起来后会在后边跟上。先写到这。

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fengyecsdn

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值