日期:2014-05-16  浏览次数:20653 次

解决 ajax response 上限问题

问题描述:需要在GIS项目中实现多边形查询,将多个坐标传回服务器端当作查询的条件,然后返回查询结果。我们使用AJAX完成这部分操作。

?

而使用AJAX查询数据时,响应回客户端的信息有一定的上限 (即AJAX不能传回大量的数据)。下面给出我的解决方案。

?

? ? ? 一、使用AJAX将“查询条件”存到服务器端,返回一个令牌(token)。

? ? ? 二、引入脚本文件,令牌当作参数。脚本文件是通过令牌生成的查询结果。

?

详细实现:

1.buss.js

?

     WebService("GISWCFService.svc/ConstructRestQueryLayerUrl", function(obj){
        document.body.appendChild(document.createElement('script')).src = "webservice/js.aspx?uuid="+obj;
     }, ConstructRestQueryLayerUrlError, { Where: Where, geometry: jsonRestPolygon });

WebService是一个AJAX封装,参数为:WebService(地址,成功时执行的方法,失败时执行的方法,条件);?

?

2.GISWCFService.svc

?

[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string ConstructRestQueryLayerUrl(string Where, string geometry) 
{
    if (isAuthenticatedUser() == false) { return ""; }//用户验证
    string[] str = {Where, geometry};//查询条件存到数组中
    string key = System.Guid.NewGuid().ToString();//得到一个TOKEN
    Global.GetInstance().Dic.Add(key, str);//将查询条件存到全局变量中
    return key;//返回TOKEN给客户端
}

GISWCFService.svc 是一个WCF文件,目的参照其注释。

?

3.Global.cs

?

public class Global
{
	  private Global() { }
	
	  private static Global uniqueGlobal = new Global();
	  public static Global GetInstance(){
	      return uniqueGlobal;
	  }
	
	  private Dictionary<String, string[]> dic = new Dictionary<string,string[]>();
	
	  public Dictionary<String, string[]> Dic
	  {
	      get { return dic; }
	      set { dic = value; }
	  }
}

?Global.cs是自定义的一个全局类,用来保存数据。

?

4.js.aspx

?

public partial class js : System.Web.UI.Page
{
  private PoliceService policeService = new PoliceService();//实例化查询对象
  protected void Page_Load(object sender, EventArgs e)
  {
    if (Request.Params != null)// 若有参数
    {
      string key = Request.Params["uuid"].ToString();//得到TOKEN
      string[] content = Global.GetInstance().Dic[key];//通过TOKEN取查询条件
      string output = policeService.ConstructRestQueryLayerUrl(content[0], content[1]);//查询

      Response.Clear();
      Response.ClearHeaders();
      Response.AppendHeader("content-type", "text/js"); 
      Response.Write("ConstructRestQueryLayerUrlSuccess('" + output + "');");//生成方法
      Response.End();
    }
  }
}

?js.aspx文件目的是生成一个JS文件。我们用他来构建一个方法的调用。

?

?

执行顺序:

1.buss.js的WebService方法提交查询条件给服务器。

2.GISWCFService.svc把条件存到服务器,并且返回一个令牌,方便客户端查找。

3.buss.js的

?

 document.body.appendChild(document.createElement('script')).src = "webservice/js.aspx?uuid="+obj;

?调用生成好的JS代码。这一步直接调用结果(类似ConstructRestQueryLayerUrlSuccess('{key, value}');)。


?

?