解决方案1:webservice + jsonp 但是jsonp跨域访问只能以get方式请求,而调用webservice却只能以post方式调用。
解决方案2:WCF + soap
SOAPProxyFabric.fromUrl("http://xxxx/WCFName.svc?singleWsdl",true,gotproxycallback); function gotproxycallback(proxy,wsdl,text){ var p={"userName": "xxxx","password": "xxxxxxx"};//方法参数以json形式声明 if (proxy instanceof SOAPProxy) { proxy.MethodName(p,resultcallback,failurecallback);//调用WCF,传入参数p } }
//执行后的回调函数 相当于success:function function resultcallback(res,xml,text,proxy){ var dataObj = eval("(" + res + ")");//wcf方法返回的数据json后面怎么解析没弄明白 }
SOAPProxyFabric不知道是aapcan自己封装的还是哪里来的,反正没弄明白。
解决方案3:一般处理程序(*.ashx)+ jsonp
服务器端:
using Bll; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; namespace uniRMS.Website.mobileService { /// <summary> /// GetNewsList 的摘要说明 /// </summary> public class GetNewsList : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; int page = Int32.Parse(context.Request["page"].ToString()); int pageSize = Int32.Parse(context.Request["pageSize"].ToString());//每页多少条记录(固定) List<News> list = new List<News>(); BllNews bll = new BllNews(); //绑定数据 string fldSort = "*";//字段名(全部字段为*) string sort = "order by id DESC";//排序字段 int pageIndex = page;//指定当前为第几页 DataTable dt = bll.Pages(pageSize,pageIndex,fldSort,sort,"type=1"); if (dt == null || dt.Rows.Count == 0) { context.Response.Write(""); } foreach (DataRow dr in dt.Rows) { News n = new News(); n.id = dr["id"].ToString(); n.title = dr["title"].ToString(); n.time = DateTime.Parse(dr["time"].ToString()).ToString("yyyy-MM-dd"); list.Add(n); } // 返回客户端定义的回调函数 var callBack = context.Request["<span style="color:#ff0000;">callbackparam2</span>"].ToString(); //获得客户端提交的回调函数名称 context.Response.Write(callBack + "(" + Newtonsoft.Json.JsonConvert.SerializeObject(list) + ")"); } public bool IsReusable { get { return false; } } } }客户端:
function Bind(page) { var xhrurl = "http://xxxxx:8111/mobileService/GetNewsList.ashx";//跨域URL $.ajax({ type : "get",async : false,//异步(true)/同步(false) url : xhrurl,cache : false,data : { page : page,pageSize : 5 },dataType : "jsonp",//返回数据类型 jsonp : "callbackparam2",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback) jsonpCallback : "success_jsonpCallback2",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据 success : function(json) { //获取数据并解析json var obj = json; for (var i = 0; i < obj.length; i++) { $("#newslist").append("<a onclick=\"jumpToInfo('" + obj[i].id + "')\">" + obj[i].title + "<span class='l_time'>" + obj[i].time + "</span></a>"); } },error : function(e) { //错误处理 } }); }这是我采用的方案,方案1/2并没有做太多研究。这里有一个问题就是当一个页面多次以这种方式调用的时候,回调函数什么的名字尽量不要一样,如果是异步请求的时候返回数据就会混乱,导致请求后数据返回出现问题。