日期:2014-05-16 浏览次数:20653 次
问题描述:需要在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}');)。
?
?