Ajax跨域与WebService进行数据交互

来源:luqidong 发布时间:2013-08-24 11:38:49 点击数:

Ajax直接与WebService进行数据交互,比较简单。
       JavaScript跨域访问WebServices需要注意的几个事项:
       1丶在WebService对应的web.config中system.web节点下加入
            <webServices>
                  <protocols>
                        <add name="HttpSoap"/>
                        <add name="HttpPost"/>
                        <add name="HttpGet"/>
                        <add name="Documentation"/>
                  </protocols>
            </webServices>   //因为webservice默认不允许get,post等方式请求服务.
        78OA办公系统
    
2丶 对跨域请求服务的地址做特殊处理,格式如:http://172.16.92.32/test4/DataServices.asmx/GetStuById?callback=? 
      其中callback=?是重点,其中?符号会被JQuery自动替换成其它的回调方法名称,具体过程和原理我们这里不予理会。
      我们关心的是callback=?起什么作用了? 原来callback=?被替换后,会把方法名称传给服务器。我们在服务器端要做什么工作呢?
      服务器要接受参数callback,然后把callback的值作为JSON数据方法名称返回。响应成功后,就是我们脚本端对应的回调函数.
      78OA办公系统
   
3丶 前台脚本请求时,将dataType设置为json或jsonp. 其他类型均不能成功得到响应数据.

4丶$.ajax(
      {
         url:'',
         dataType:'json or jsonp',
         type:get,
         data:{},
         success:function(json){},
       }) 的请求效果等同于 $.getJSON(url,data,function). //$.getJSON 以get方式请求返回json数据结果.,
       78OA办公系统

5丶WebService端代码参考示例.
   [WebMethod]
   public void GetLoginId(string loginId)
   {
       string callback = HttpContext.Current.Request["callback"];
       List<Student> stuList = new List<Student>()
       {
          new Student(){Name="张三",Age=18},
          new Student(){Name="李四",Age=15}
       }
       JavaScriptSerializer jss = new JavaScriptSerializer();
       string jsonObjStr = jss.Serialize(stuList);
       //额外追加上的一对括号["()"]不能删除,否则不能正常得到数据,最终返回的结果
       //结构类似于:  ?(jsonObj) ,供前台回调处理.
       HttpContext.Current.Response.Write(callback +"("+jsonObjStr+")");
       HttpContext.Current.Response.End();
   }