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等方式请求服务.
2丶 对跨域请求服务的地址做特殊处理,格式如:http://172.16.92.32/test4/DataServices.asmx/GetStuById?callback=?
其中callback=?是重点,其中?符号会被JQuery自动替换成其它的回调方法名称,具体过程和原理我们这里不予理会。
我们关心的是callback=?起什么作用了? 原来callback=?被替换后,会把方法名称传给服务器。我们在服务器端要做什么工作呢?
服务器要接受参数callback,然后把callback的值作为JSON数据方法名称返回。响应成功后,就是我们脚本端对应的回调函数.
3丶 前台脚本请求时,将dataType设置为json或jsonp. 其他类型均不能成功得到响应数据.
4丶$.ajax(
{
url:'',
dataType:'json or jsonp',
type:get,
data:{},
success:function(json){},
}) 的请求效果等同于 $.getJSON(url,data,function). //$.getJSON 以get方式请求返回json数据结果.,
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();
}