1.1 配置站点
在第二章中,我们介绍过站点由若干MapGuide服务器组成,MapGuide服务器包括站点服务器和支持服务器两类服务器。MapGuide服务器和Web应用服务器和MapGuide Web扩展部署到不同的计算机上,例如在图4-1中,站点由两台MapGuide服务器组成,其中一台用作站点服务器,一台用作支持服务器,这两台服务器和MapGuide Web扩展都部署在不同的计算机上。这时,它们都必须相互知道彼此的IP地址和通信端口,MapGuide Web扩展需要知道站点服务器的IP地址,这样才能够将来自客户端的请求转发给站点服务器;站点服务器也需要知道支持服务器的地址,这样才能将服务请求转发到部署了此服务的支持服务器。
图4-1 站点示例
通过MapGuide Web扩展配置文件webconfig.ini,MapGuide Web扩展能够找到站点服务器的IP地址和通信端口。打开这个文件,查看SiteConnectionProperties部分的内容,可以看到类似如下的信息,IpAddress和Port就是用来指定站点服务器的IP地址和通信端口。
[SiteConnectionProperties] # ***************************************************************************** # S I T E C O N N E C T I O N # # Property Name Description # ----------------------------------------------------------------------------- # IpAddress The IP address of the site server # 0 < Length <= 255 # Port The port to use for site operations # # WARNING: If you change the port # here you # must also change the corresponding # port # for the server configuration # file. # # ***************************************************************************** IpAddress =127.0.0.1 Port = 2812 |
通过MapGuide 服务器配置文件serverconfig.ini,够找到站点服务器的IP地址和通信端口,以及当前服务器是否部署了某种服务。打开这个文件,查看SiteConnectionProperties部分的内容,IpAddress和Port就是用来指定站点服务器的IP地址和通信端口;查看HostProperties部分的内容,属性DrawingService、FeatureService、KmlService、MappingService、RenderingService、ResourceService、SiteService、TileService用于指定是否部署这些服务到当前服务器上。
[SiteConnectionProperties] # ***************************************************************************** # S I T E C O N N E C T I O N # # Property Name Description # ----------------------------------------------------------------------------- # IpAddress IP address of the site server # 0 < Length <= 255 # MaxConnections Max # of open site connections # 0 < Value <= 1024 # Port Port to use for site operations # # WARNING: If you change the port # here you # must also change the corresponding # port # for the web tier configuration # file. # # QueueSize Max # of site operations to queue # 0 < Value <= 1024 # ThreadPoolSize # of threads available for processing # site operations # 0 < Value <= 1024 # ***************************************************************************** IpAddress = 127.0.0.1 MaxConnections = 20 Port = 2812 QueueSize = 20 ThreadPoolSize = 10
[HostProperties] # ***************************************************************************** # H O S T # # Property Name Description # ----------------------------------------------------------------------------- # DrawingService 0 = service unavailable, 1 = service available # FeatureService 0 = service unavailable, 1 = service available # KmlService 0 = service unavailable, 1 = service available # MappingService 0 = service unavailable, 1 = service available # RenderingService 0 = service unavailable, 1 = service available # ResourceService 0 = service unavailable, 1 = service available # SiteService 0 = service unavailable, 1 = service available # TileService 0 = service unavailable, 1 = service available # ***************************************************************************** DrawingService = 1 FeatureService = 1 KmlService = 1 MappingService = 1 RenderingService = 1 ResourceService = 1 SiteService = 1 TileService = 1 |
1.2 站点服务
站点服务是MapGuide其他类型服务的基础,它主要用于:
l 认证用户信息,如用户是否存在,密码是否正确。
l 创建MapGuide提供的服务,如资源服务、要素服务等。
l 枚举用户、用户组、角色等信息。
l 管理Session。
1.2.1 创建到站点服务器的连接
类MgSiteConnection用于创建到站点服务器的连接,调用方法MgSiteConnection::Open(…)就可以创建一个到站点服务器的连接,在此我们需要通过MgUserInformation的一个实例提供用户认证信息,例如用户名、密码或Session ID。需要注意的是,在创建到站点服务器的连接之前,一定要确保调用MgInitializeWebTier(…)初始化了Web层。
void Open(MgUserInformation userInformation)
如下的代码展示了如何创建一个到站点服务器的连接。
// 初始化Web层 MgInitializeWebTier('C:/Inetpub/wwwroot/PhpMapAgent/webconfig.ini'); // 创建到站点的连接 $userInformation = new MgUserInformation('Administrator', 'admin'); $siteConnection = new MgSiteConnection(); $siteConnection->Open($userInformation); |
1.2.2 创建MapGuide提供的服务
类MgServiceType定义了MapGuide提供的所有服务:
l MgServiceType::ResourceService:资源服务
l MgServiceType::DrawingService:制图服务
l MgServiceType::FeatureService:制图服务
l MgServiceType::MappingService:制图服务
l MgServiceType::RenderingService:制图服务
l MgServiceType::TileService:制图服务
l MgServiceType::KmlService:KML服务
查看上面定义的服务,我们可以发现MgServiceType并没有定义站点服务,这是因为MgServiceType中定义的服务恰恰是由站点服务创建的。调用方法MgSiteConnection::CreateService(…)可以创建一个指定类型的服务,参数serviceType用来服务类型,它可以是MgServiceType中定义的任何一个值。需要注意的是,在使用此方法之前,要保证已经调用方法MgSiteConnection::Open(…)建立了一个到站点服务器的连接。
MgService CreateService(int serviceType)
下面的代码展示了如何创建一个要素服务。
$webconfigiDotIniPath = "C:/Program Files/MapGuideOpenSource/WebExtensions/www/webconfig.ini" MgInitializeWebTier($webconfigiDotIniPath); $adminUser = new MgUserInformation("Administrator", "admin"); $siteConnection = new MgSiteConnection(); $siteConnection->Open($adminUser); $siteConnection->CreateService(MgServiceType::FeatureService); |
1.2.3 创建MgSite对象实例
类MgSite包含用来枚举用户、用户组和角色,以及管理Session的功能,但是MgSite并没有提供公有的构造方法,所以必须通过调用方法MgSiteConnection::GetSite()来获取一个MgSite对象的实例。需要注意的是,在调用此方法之前,要保证已经调用方法MgSiteConnection::Open(…)建立了一个到站点服务器的连接。
MgSite GetSite();
1.2.4 枚举用户、用户组和角色
方法MgSite::EnumerateGroups()用于返回一个XML格式的用户组列表, XML使用了文件GroupList-1.0.0.xsd指定的Schema。
MgByteReader EnumerateGroups();
在安装MapGuide服务器之后,如果没有添加任何用户组,调用此方法会返回如下的用户组列表,可以看到此时MapGuide服务器只创建了一个用户组“Everyone”。
<?xml version=”1.0” encoding=”UTF-8”?> <GroupList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="GroupList-1.0.0.xsd"> <Group> <Name>Everyone</Name> <Description>Built-in group to include all users</Description> </Group> </GroupList> |
方法MgSite::EnumerateUsers(…)以XML格式返回指定用户组内的所有用户, XML使用了文件UserList-1.0.0.xsd指定的Schema,参数group用于指定一个用户组,如果将传入一个空的用户组名称,那么返回所有的用户。
MgByteReader EnumerateUsers(String group);
在安装MapGuide服务器之后,如果没有添加任何用户,调用此方法会返回如下的用户列表,可以看到此时MapGuide服务器创建了五个用户“Administrator”、“Anonymous”、“ Author”、“ WfsUser”和“WmsUser”。
<?xml version="1.0" encoding="UTF-8"?> <UserList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="UserList-1.0.0.xsd"> <User> <Name>Administrator</Name> <FullName>Site Administrator</FullName> <Description>Built-in account for administering the site</Description> </User> <User> <Name>Anonymous</Name> <FullName>Anonymous User</FullName> <Description>Built-in account for guests with Viewer role</Description> </User> <User> <Name>Author</Name> <FullName>Map Author</FullName> <Description>Built-in account for users with Author role</Description> </User> <User> <Name>WfsUser</Name> <FullName>WFS User</FullName> <Description>Built-in account for WFS users with Viewer role</Description> </User> <User> <Name>WmsUser</Name> <FullName>WMS User</FullName> <Description>Built-in account for WMS users with Viewer role</Description> </User> </UserList> |
方法MgSite::EnumerateRoles(…)用于返回指定用户所属的角色列表,参数user用于指定一个用户。
MgStringCollection EnumerateRoles(String user);
1.2.5 管理Session
在第二章,我们介绍过MapGuide在服务器层与Web层间引入了Session的概念,用来提高服务器层与Web层间请求和响应的性能。每个Session通过一个唯一的Session ID加以标识,例如“71b5d990-0000-1000-8000-005056c00008_eng”。调用方法MgSite::CreateSession()可以为当前用户创建一个Session,返回的字符串是新建Session的ID。在创建Session的同时,还会创建一个资源库,这个资源库绑定于当前用户,用于存储和当前用户相关的资源,例如临时图层等资源,它的生命周期和Session相同,当Session销毁的时候,它也同时销毁。关于资源和资源库的内容,我们会在后续章节进行介绍。
String CreateSession();
下面的代码展示了如何创建一个Session。
MgInitializeWebTier('C:/Inetpub/wwwroot/PhpMapAgent/webconfig.ini'); $userInformation = new MgUserInformation('Administrator', 'admin'); $siteConnection = new MgSiteConnection(); $siteConnection->Open($userInformation); $site = $siteConnection->GetSite(); $sessionID = $site->CreateSession(); $userInformation->SetMgSessionId($sessionID); |
调用MgSite::DestroySession()可以销毁指定的Session,但是这个方法并不是必需的,当一个Session在设定的时间内没有任何和客户端的通信,那么MapGuide服务器会认为这个Session已经超时了,从而销毁它。通过服务器配置文件serverconfig.ini,我们可以设置这个值。打开这个文件serverconfig.ini,查看SiteServiceProperties部分的内容,可以看到类似如下的信息,SessionTimeOut用于设定超时阈值,SessionTimerIterval用于设定检查Session超时的时间间隔,它们的单位都为妙。
[SiteServiceProperties] # ***************************************************************************** # S I T E S E R V I C E # # Property Name Description # ----------------------------------------------------------------------------- # SessionTimeout Time duration in seconds for when an idle # session is expired # 0 < Value <= 86400 # SessionTimerInterval Time interval in seconds for when the server # checks for idle sessions # 0 < Value <= 2147483647 # ***************************************************************************** SessionTimeout = 1200 SessionTimerInterval = 400 |
除了创建和销毁Session之外,还可以通过方法MgSite::GetCurrentSession()获得当前Session的ID,通过方法MgSite::GetUserForSession()获得当前Session对应的用户名称,例如如果以用户 “Administrator”登录创建了一个Session,那么调用此方法会返回字符串“Administrator”。
String GetCurrentSession();
String GetUserForSession();