首先我承认,WebService技术早就不是新鲜玩意了,下面只是对整个过程的代码总结。
前台选择jQuery发送ajax请求,代码如下:
$.ajax({ type: "post", url: "Service.asmx/HelloWorld", contentType: "application/json;charset=utf-8", dataType: "json", success: function (msg) { alert(msg.d); } });
参数中,type必须是post类型,contentType也必须是application/json,否则发回的数据是xml格式,编码不是必须,但是为了保证不出乱码,还是加上utf-8,dataType写是json。
收到的数据保存在msg.d里,d就是msg的一个属性,因此不能用msg.d.属性名的方法引用发回的数据,需要增加一行处理程序:
var data = eval('(' + msg.d + ')');
data才是json解码后的内容。
然后是服务端代码,在项目中新建一个Web服务项,默认名称是Service.asmx,这个文件只有一行代码,真正的代码文件是App_Code 里的Service.cs(默认名称),在这个文件中可以看到一行被注释的: [System.Web.Script.Services.ScriptService]。这里需要去掉注释,让前台可以通过脚本访问。
Service.cs里已经默认添加了一个HelloWorld函数,并且带上了[WebMethod]标签。
为了测试json通信,这里简单设计一个保存数据的class
using System.Runtime.Serialization; namespace Tools { [DataContract] public class UserInfo { private string _uid; private string _name; private DateTime _time; [DataMember(Order=1)] public string Uid { get { return _uid; } set { _uid = value; } } [DataMember(Order=2)] public string Name { get { return _name; } set { _name = value; } } [DataMember(Order=3)] public DateTime Time { get { return _time; } set { _time = value; } } } }
为了让编译器正确解析DataMember标签,需要引用System.Runtime.Serialization,如果添加了using语句,编译器依然报错,那就在项目里添加它的引用。
接下来回到Service.cs中编写json生成代码。
Order参数表明该项出现在Json数据的第几项,从1开始编号。
Userinfo info =new Userinfo(); info.Uid="我是ID"; info.Name = "测试"; info.Time=DataTime.Now(); DataContractJsonSerializer dc = new DataContractJsonSerializer(info.GetType()); string result; using (MemoryStream ms = new MemoryStream()) { dc.WriteObject(ms, info); result = Encoding.UTF8.GetString(ms.ToArray()); } return result;
使用DataContractJsonSerializer需要包含System.Runtime.Serialization.Json引用,使用MemoryStream需要包含System.IO引用,使用Encoding需要包含System.Text引用。
至此,前台已经可以接受json数据,但是info.Time的解析很特别,是类似\\/Date(1300074709000+0800)\\/的字符串,需要进一步解析。
解析的目标是取出1300074709000
+0800,代码如下:
tstr = data.Time;
left = tstr.indexOf('(');
tstr = tstr.substring(left + 1, tstr.length-2);
var t = new Date(parseInt(tstr));
然后再用标准Date手段处理日期。
评论