Using the proxy
代理包含服务器端代码,该代码运行在您的web服务器上。您的浏览器基于web应用程序将请求发送给代理,然后代理将请求转发给远程web服务器,并将远程服务器返回的响应传递回应用程序。
您可能需要在下列情况下使用代理:
- 您试图访问的资源位于与应用程序不同的域上,而“跨源资源共享”(CORS)支持是不可用的。CORS是一个规范,允许web服务器与web浏览器进行交互,以确定是否允许跨源请求。
注意:为了使用cors,浏览器和目标web服务器都必须支持CORS。ArcGIS Server 10.1支持CORS。对于早期版本,管理员可以添加CORS支持。访问enable-cors.org查看详细说明。
- 应用程序访问以令牌身份验证为安全的服务,并且您不希望允许用户查看令牌,或者您不希望在web服务器和用户之间传输令牌。
- 您正在构建一个应用程序,该应用程序针对终端用户,而ArcGIS平台并不知道。在这种情况下,应用程序将使用存储在代理中的信息登录到平台。查看Authentication、OAuth 2.0和ArcGIS以获取详细信息。
- 请求超出浏览器强加的统一资源定位器(URLs)长度的限制。您可能遇到URL长度问题的常见场景是当您使用来自复杂多边形的缓冲区作为查询任务的输入的时,或者使用well-known的文本(WKT)指定空间引用。
注意:使用代理通过执行POST请求而不是GET请求来围绕此问题进行工作。POST请求不受2048字符最大限制,因为信息是在头而不是URL中传递的。
1、获取代理
代理运行在本地web服务器上,而不是在Esri服务器上或安装ArcGIS Server上的计算机上运行(除非您的web服务器还承载了ArcGIS Server实例)。每个针对特定服务器端平台的三个代理都可以使用:ASP.NET、Java/JSP和PHP,从GitHub下载您的平台的合适代理。每个代理下载都包括安装说明和有关任何系统需求的信息,确保您遵循这些指令,以便在您的web服务器上安装和配置代理。
2、使用代理
为了使应用程序通过代理发送请求,您必须向应用程序添加代码来定义代理的位置。如果应用程序中的所有请求都使用相同的代理,则可以使用proxyUrl指定代理位置。您还可以通过alwaysUseProxy指定是否应该始终使用代理来进行通信。
esriConfig.defaults.io.proxyUrl = "<url_to_proxy>"
esriConfig.defaults.io.alwaysUseProxy = false;
在上面的代码中,esriConfig引用了esri/config模块返回的对象。
另一个选项是设置一个代理规则,该规则定义了具有相同URL前缀的资源集的代理。如果请求的URL匹配规则,则请求将通过代理路由。若要定义代理规则,指定代理的URL和需要通过代理访问的资源的前缀。
urlUtils.addProxyRule({
urlPrefix: "route.arcgis.com",
proxyUrl: "<url_to_proxy>"
});
在上面的代码中,urlUtils引用了esri/urlUtils模块返回的对象。
注意:如果您在代理中存储登录信息(用户名和密码或客户端_id和客户端_机密),您将希望使用addProxyRule选项,以便通过代理路由对具有指定URL前缀的资源的请求。
3、测试代理
一旦您为应用程序配置代理,请测试应用程序以确保正确处理请求。应用程序应该像在代理执行之前一样正常运行。如果不是,则可能需要对代理进行故障排除。下面的疑难解答提示可能有助于您找到并解决问题:
- 如果应用程序环境支持调试模式,则您可以在代理中设置断点并检测是否正确运行。
例如,在IIS/ASP.NET环境中,您可以在Visual Studio中打开应用程序,并在ProcessRequest方法中设置断点。然后在调试模式下运行应用程序。执行将停止在断点处,并且您可能能够检测出问题所在。您还可以在应用程序的javascript函数中设置断点,或者插入alert()语句以显示执行期间的值。
- 将ProxyConfig的mustMatch属性设置为false以代理所有请求。如果应用程序工作时,此值设置为false,您可能没有在serverurls部分列出您的服务,或者您可能在serverUrl中出现错误。当您完成了代理故障排除时,不要忘记将此属性设置为true。
- 启用对代理的日志记录。一旦启用了消息,则将消息写入日志,该日志在故障排除时可能有用。
- 请确保您已在应用程序代码中指定了代理的正确位置。您可以使用浏览器开发工具来确定代理是否被定位。为此,激活浏览器调试工具,然后检查网络reqeusts并查找POST给代理的请求。如果您看到404 error,则意味着未找到代理。检查请求属性以查看应用程序正在寻找代理的路径。
4、保护代理应用程序
如果应用程序使用基于令牌的安全性服务,代理配置为用户名和密码,或者client_id和client_secret,代理应用程序需要被保护,以便只有授权的应用程序才能访问。查看Authentication, OAuth 2.9, 和ArcGIS获取更多细节信息