ajax跨域访问服务器

来源:互联网 发布:广州淘宝进货都在哪里 编辑:程序博客网 时间:2024/06/03 15:08

 解决方案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, true, resultcallback, failurecallback);//调用WCF,传入参数p                                     }        }
//执行后的回调函数  相当于success:functionfunction 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并没有做太多研究。这里有一个问题就是当一个页面多次以这种方式调用的时候,回调函数什么的名字尽量不要一样,如果是异步请求的时候返回数据就会混乱,导致请求后数据返回出现问题。

0 0
原创粉丝点击