Ajax中使用json这个轻量级数据类型通信的好处相信大家已经很清楚,考虑到安全问题,Asp.net Ajax的webService使用json,应该防止Json Hijacking。因此通常我们的做法是在使用Post请求式,并将 请求的content-type设置成application/json; charset=utf-8。但客户端如果你使用的是Jquery,有三 个细节问题是我们应该注意的:
1 :如果我们Post时没有任何数据传给服务端,请指定Data:{} 如:
Code
1 $.ajax({
2 type: "POST",
3 url: "PageMethod.aspx/PageMethodName",
4 data: "{}",//注意这里不可省。
5 contentType: "application/json; charset=utf-8",
6 dataType: "json"
7 });
这是因为在IIS中post请求时Content —Length是必须提供的,即使没用任何Post Data.Content-Length也应该设为0,但这样的话Jquery不会自动设置Header,除非请求中包含post Data。 而Asp.net Ajax的json传输,又要求post方式,因此我们不能改变他的请求方式。简便的解决法案就是在 请求中给定一个空的json 对象。以符合IIS的要求,此时Content-Length为2。这时在服务端我可以完全 忽略这个为空的参数,并处理相应的请求。
2:当post data 不为空时。我们应该避免在beforeSend事件里设置RequestHeader。
如一点所述的范例post data 为空时,既然jquery不能自动设置Header,我们能否手工帮他设置呢? 答案时是
肯定的。这时我们是在beforeSend事件中设置的。如代码所示(请注意:必须设置为 application/json否则webservice
时不会返回json。这也是出于安全的考虑)。
Code
1 $.ajax({
2 type: "POST",
3 url: "WebService.asmx/WebMethodName",
4 beforeSend: function(xhr) {
5 xhr.setRequestHeader("Content-type",
6 "application/json; charset=utf-8");
7 },
8 dataType: "json"
9 });