ajax跨域访问服务器

 解决方案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: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并没有做太多研究。这里有一个问题就是当一个页面多次以这种方式调用的时候,回调函数什么的名字尽量不要一样,如果是异步请求的时候返回数据就会混乱,导致请求后数据返回出现问题。

你可能感兴趣的:(跨域,jquery,Ajax,服务器)