环境:服务器 geoserver2.4.1


开发机访问服务器发布的wms 存在跨域问题,研究两天终于找到解决方案。

主要思路是: 使用jquery的ajax 代替Groserver的request, 然后将wms的请求地址转发到.net的处理程序, 使用.net的处理程序进行跨域处理。

functionmouseClick(e){varlayer=newArray();layer=map.getLayersByName("Simple_Geometry");if(layer!=null)for(vari=0;i<layer.length;i++){map.removeLayer(layer[i]);}varwms_url="http://10.72.4.219:8089/geoserver/xj/wms?";varparams={REQUEST:"GetFeatureInfo",BBOX:map.getExtent().toBBOX(),WIDTH:map.size.w,HEIGHT:map.size.h,X:e.xy.x,Y:e.xy.y,SERVICE:"WMS",QUERY_LAYERS:map.layers[0].params.LAYERS,INFO_FORMAT:'text/html',FEATURE_COUNT:50,Layers:'xj:cswl_group',Styles:"",format:"application/vnd.ogc.gml",EXCEPTIONS:"application/vnd.ogc.se_xml",//Exception类型srs:'EPSG:4326'};vardomainUrl="crossDomain.ashx?URL=";varrequest=parpreUrl(wms_url,params);request=encodeURIComponent(encodeURIComponent(request));$.post(domainUrl+request,"",function(e){document.getElementById('nodelist').innerHTML=e;});OpenLayers.Event.stop(e);}functionparpreUrl(url,paramsObj){for(varkinparamsObj){url+=(k+"="+paramsObj[k]+"&");}returnurl;}

如果使用Groserver.ProxyHost , 会遇到 triggerEvent未定义问题,所以使用了jqueyr的ajax代替 Geoserver.Request ,另外

publicvoidProce***equest(HttpContextcontext){context.Response.ContentType="text/html";stringurl="";url=context.Request.QueryString["URL"].ToString();url=context.Server.UrlDecode(url);HttpWebRequestloHttp=(HttpWebRequest)WebRequest.Create(url);loHttp.Timeout=10000;//10secsloHttp.UserAgent="WebClient";HttpWebResponseloWebResponse=(HttpWebResponse)loHttp.GetResponse();Encodingenc=Encoding.GetEncoding(65001);StreamReaderloResponseStream=newStreamReader(loWebResponse.GetResponseStream(),enc);stringlcHtml=loResponseStream.ReadToEnd();context.Response.Write(lcHtml);loWebResponse.Close();loResponseStream.Close();}


这样就可以解决 跨域问题