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

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...