`

Openlayer加载WFS图层及C#编写ASP.net代理解决跨域问题,好长的题目

阅读更多

NND,openlayers跨域访问geoserver居然要用到代理,貌似Felx就不用,用C#编写代理网上普遍是这样的:

    public class GeoServerProxy1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            if (context.Request.QueryString["URL"] != null)
            {
                string url = "";
                url = context.Request.QueryString["URL"].ToString();
                HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(url);
                loHttp.Timeout = 10000;     // 10 secs
                loHttp.UserAgent = "Web Client";
                HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();
                Encoding enc = Encoding.GetEncoding(65001);
                StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);
                string lcHtml = loResponseStream.ReadToEnd();
                context.Response.Write(lcHtml);
                loWebResponse.Close();
                loResponseStream.Close();
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

 但是上面这种情况,没有考虑post,不适用于openlayers官方的wfs协议访问,但是可以用于http查询方式的访问,例如:

vectorLayer = new OpenLayers.Layer.Vector("覆冰点", {
                    protocol: new OpenLayers.Protocol.HTTP({
                        //url: "http://10.180.80.206:9000/geoserver/sdgis/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sdgis:V_YL_24&maxFeatures=50",
                        //url: "http://10.180.80.206:9000/geoserver/sdgis/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sdgis:GIS_WEATHER_FORECAST&maxFeatures=50",
                        url: "http://10.180.80.206:9000/geoserver/sdgis/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sdgis:V_FBJC_PT&maxFeatures=50",
                        format: new OpenLayers.Format.GML()
                    }),
                    styleMap: new OpenLayers.StyleMap({
                        'default': {
                            strokeColor: "#00FF00",
                            strokeOpacity: 1,
                            strokeWidth: 2,
                            fillColor: "#FF0000",
                            fillOpacity: 1,
                            pointRadius: 6,
                            strokeDashstyle: 'longdashdot',
                            pointerEvents: "visiblePainted",
                            externalGraphic: "snow.gif",
                            graphicWidth: 12,
                            graphicHeight: 12,
                            //label: "name: ${OWNER}, age: ${FLAGS}",

                            fontColor: "${favColor}",
                            fontSize: "12px",
                            fontFamily: "Courier New, monospace",
                            fontWeight: "bold",
                            labelAlign: "${align}",
                            labelXOffset: "${xOffset}",
                            labelYOffset: "${yOffset}"
                        }
                    }),
                    renderers: renderer,
                    strategies: [new OpenLayers.Strategy.Fixed()]
                });

 我们,先来看看openlayers官方wfs协议是怎么访问的:

var fbjcLayer = new OpenLayers.Layer.Vector("FBJC_PT", {
                strategies: [new OpenLayers.Strategy.BBOX()],
                protocol: new OpenLayers.Protocol.WFS({
					 version: "1.1.0",
                    url: "http://10.180.80.206:9000/geoserver/wfs",
                    featureType: "sdgis:V_FBJC_PT",
                    featureNS: "sdgid"
                }),
                renderers: OpenLayers.Layer.Vector.prototype.renderers
            });

 这是一个post请求,我们修改代理程序来支持,如果用网上流传的代理程序会报parameter missing异常,下面是改进后的C#代理:

public class GeoServerProxy1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            if (string.IsNullOrEmpty(context.Request["URL"])) return;
            HttpWebRequest request = (HttpWebRequest) WebRequest.Create(context.Request["URL"]);
            request.UserAgent = context.Request.UserAgent;
            request.ContentType = context.Request.ContentType;
            request.Method = context.Request.HttpMethod;

            byte[] trans = new byte[1024];
            int offset = 0;
            int offcnt = 0;

            if (request.Method.ToUpper() == "POST")
            {
                Stream nstream = request.GetRequestStream();
                while (offset < context.Request.ContentLength)
                {
                    offcnt = context.Request.InputStream.Read(trans, offset, 1024);
                    if (offcnt > 0)
                    {
                        nstream.Write(trans, 0, offcnt);
                        offset += offcnt;
                    }
                }
                nstream.Close();
            }
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            //Encoding enc = Encoding.GetEncoding(65001);
            context.Response.ContentType = response.ContentType;
            StreamReader loResponseStream = new StreamReader(response.GetResponseStream());
            string lcHtml = loResponseStream.ReadToEnd();
            context.Response.Write(lcHtml);
            response.Close();
            loResponseStream.Close();

        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

 

 

0
4
分享到:
评论
1 楼 tedeum 2013-08-27  
function newLayer(name, type) {
	return new OpenLayers.Layer.Vector(name, {
		strategies: [new OpenLayers.Strategy.Fixed()],
		protocol: new OpenLayers.Protocol.WFS({
		url: "http://10.180.80.206:9000/geoserver/wfs",
		featurePrefix:"sdgis",
		featureType: type,
		featureNS: "http://www.enersun.com.cn",
		srsName: "EPSG:4326",
		version: "1.1.0"
	  })
	});
}

相关推荐

    openlayers 加载Geoserver wfs服务

    利用openlayers加载geoserver wfs服务发布的矢量图层。

    解决openlayers跨域访问的解决方案

    然而,由于浏览器的同源策略限制,当你尝试从不同的域加载地图或者地理数据时,可能会遇到跨域访问的问题。下面将详细介绍如何解决OpenLayers中的跨域问题。 ### 一、理解同源策略 同源策略是Web浏览器的一项安全...

    使用代理解决WFS服务跨域测试代码

    代理服务器是解决跨域问题的一种常见方法。它充当了客户端和目标服务器之间的中介,客户端向代理服务器发送请求,代理服务器再将请求转发到目标服务器,获取的数据再由代理服务器返回给客户端。这样,浏览器就只与...

    openlayer3加载geoserver发布的WFS服务

    openlayer3加载geoserver发布的WFS服务,并通过openlayers中的line string实现人/车辆移动的轨迹信息

    openlayer加载

    ### OpenLayer加载原理及其应用实例 #### 一、OpenLayer加载原理概述 OpenLayer是一种流行的JavaScript库,专门用于Web GIS应用程序的开发。该库能够帮助开发者轻松地在网页上加载和展示各种地理空间数据,包括但...

    解决arcgis server跨域问题

    解决arcgis server跨域问题: 1、停掉ArcGIS Server的服务。 2、 打开&lt;ArcGIS Server&gt; \framework\runtime\tomcat\conf\web.xml,注册跨域bean 3、lib下拷贝 cors-filter-2.5.jar java-property-utils-1.9.1.jar包 4...

    cesium结合geoserver利用WFS服务实现图层编辑.zip

    这个压缩包文件"cesium结合geoserver利用WFS服务实现图层编辑"应该包含了一个示例项目,可以帮助你更好地理解这些概念并进行实践。通过学习和实践,你可以掌握这一强大的技术组合,为你的GIS应用增添丰富的交互性和...

    通过代理解决WFS服务跨域测试代码

    然而,当我们尝试从一个域访问WFS服务时,如果该服务位于另一个域,就会遇到跨域问题。为了解决这个问题,我们可以使用代理服务器。 代理服务器是一种在网络应用层或传输层上工作,作为客户端和服务器之间的中介。...

    cesium结合geoserver利用WFS服务实现图层新增.zip

    在IT行业中,尤其是在地理信息系统(GIS)领域,Cesium和GeoServer是两个非常重要的工具。Cesium是一款基于WebGL的开源...在实际项目中,还需要考虑错误处理、用户界面设计、数据安全等问题,以提供更完善的解决方案。

    leaflet结合geoserver利用WFS服务实现图层编辑.zip

    6. **添加WFS图层**:使用L.GeoJSON构造函数,将WFS服务返回的GeoJSON数据转换为可操作的图层,并添加到地图上。通过监听`click`事件,实现点击图层时获取特征信息。 7. **实现编辑功能**:Leaflet有多种方式实现...

    openlayer3加载谷歌地图例.rar

    这仅仅是OpenLayer 3功能的冰山一角,它还支持自定义图层、标记、图层叠加、WMS/WFS服务等,提供了丰富的API供开发者进行深入定制。希望这个教程能帮助你更好地理解和应用OpenLayer 3,打造属于你自己的WebGIS项目。

    openlayers加载arcgis发布的OGC WMS服务

    这里,`your_arcgis_server/wms`是ArcGIS Server提供的WMS服务URL,`your_layer_name`是你想加载的具体图层名。 3. **添加图层到地图**:最后,将WMS图层添加到地图中。 ```javascript map.addLayer(wmsLayer); ``...

    Geoserver+openlayer+postGis要素增删改查

    "Geoserver+openlayer+postGis要素增删改查"是一个综合性的项目,它结合了三个关键组件:PostGIS、GeoServer和OpenLayers,来实现这一目标。下面将详细介绍这三个组件及其相互作用。 1. **PostGIS**: PostGIS 是 ...

    Openlayer 简单实例10

    在这个“Openlayer简单实例10”中,我们着重关注如何将不同的图层,如WMS(Web Map Service)和WFS(Web Feature Service)图层叠加到Google Maps上,并理解相关的核心概念。 首先,`options`对象是用来初始化...

    vue集成openlayers加载geojson并实现点击弹窗教程

    本文实例为大家分享了vue+openlayers加载geojson并实现点击弹窗教程,供大家参考,具体内容如下 第一步:安装vue-cli cnpm install -g @vue/cli 第二步:新建一个项目 1.新建项目 (vue-openlayers为项目名),并...

    SuperMap Objects入门——C#.Net源码.zip

    《SuperMap Objects入门指南——基于C#.Net的源码解析》 SuperMap Objects是一款强大的地理信息系统(GIS)开发组件,广泛应用于地图数据处理、空间分析和应用系统开发中。本教程将带你逐步入门SuperMap Objects,...

    leaflet结合geoserver利用WFS服务实现图层删除.zip

    2. **使用Leaflet加载WFS图层**: - 引入Leaflet库和Leaflet插件`L.GeoJSON`,这个插件可以解析GeoJSON格式的数据,它是WFS返回的一种常见格式。 - 创建一个新的GeoJSON图层,通过`L.geoJSON()`函数,将从...

    cesium结合geoserver利用WFS服务实现图层删除.zip

    本教程将详细介绍如何将Cesium与GeoServer集成,通过WFS(Web Feature Service)服务来实现图层的删除操作。以下是详细的知识点讲解: 1. **Cesium**:Cesium是一个基于 WebGL 的JavaScript库,它允许开发者在...

    解决geoserver跨域问题.rar

    为了解决这个问题,我们需要对GeoServer进行一些配置,以启用跨域资源共享(CORS,Cross-Origin Resource Sharing)。 首先,我们来看一下`cors-filter-2.6.jar`这个文件。这是一个用于处理HTTP请求的过滤器,可以...

    openLayers geoserver常见问题

    TMS(Tile Map Service)是一种分块加载地图图像的服务,OpenLayers支持TMS图层,通过`OpenLayers.Layer.TMS`创建。 设置瓦片大小主要在TileCache或WMS服务配置中完成。 大数据量线绘制可以考虑分段加载、动态加载...

Global site tag (gtag.js) - Google Analytics