2. 创建GeoRSS 订阅源
在此练习中,您将在 ASP.NET Web 应用程序中实现 HTTP 处理程序以返回 GeoRSS 订阅源。GeoRSS 是在 RSS 订阅源中包含地理空间数据时所用的一个标准,它定义了一种名为 GeoRSS GML 的特定格式,用来在订阅源中包含 GML 格式的数据。客户端应用程序可以订阅 GeoRSS 订阅源,订阅方式与订阅常规 RSS 订阅源相同。可以轻松地将 GeoRSS 格式的数据导入 Microsoft Virtual Earth VEMap 控件中。
注意:您可以从 C:\SQLHOLS\Spatial and VE\Solution\StoreFinderSite 中的完成的网站页面复制此练习中所用的代码。
实现 HTTP 处理程序
1. 启动 Microsoft Visual Studio 2008。
2. 在文件菜单中,单击打开网站,然后打开 C:\SQLHOLs\Spatial and VE\Starter\StoreFinderSite 网站。
3. 在解决方案资源管理器中,展开 App_Code,然后双击 GeoRSSHandler.vb 在代码编辑器中打开它。
注意:HTTP 处理程序是一个代码模块,用于处理对 Web 应用程序的 HTTP 请求。通常由默认 ASP.NET 请求处理程序处理对 ASP.NET Web 应用程序的请求,但是您可以针对特定文件扩展名创建自定义处理程序。在本例中,您将实现一个将用于处理扩展名为 .georss 的文件的请求的处理程序。
4. 检查现有的代码。处理传入请求的过程名为 ProcessRequest。请注意,此过程不完整,包含大量必须添加代码的注释。
5. 在注释 Build the GeoRSS feed下,添加以下代码,以开始构建将由 HTTP 处理程序返回的 GeoRSS 订阅源。
rssOutput.AppendLine("xmlns:georss='http://www.georss.org/georss'")
rssOutput.AppendLine("xmlns:gml='http://www.opengis.net/gml'>")
rssOutput.AppendLine("<title>Stores</title>")
rssOutput.AppendLine("<subtitle>Store Locations</subtitle>")
rssOutput.AppendLine("<link href='http://localhost/storefindersite/'/>")
rssOutput.AppendLine("<updated>" + System.DateTime.Now + "</updated>")
rssOutput.AppendLine("<author>")
rssOutput.AppendLine("<name>SQL Server</name>")
rssOutput.AppendLine("</author>")
6. 在注释 Open a connection to the database下,添加以下代码。
sqlConn.Open()
7. 在注释 Use the GetStoresGML stored proc to get all stores by default下,添加以下代码。
spName = "GetStoresGML"
注意:默认情况下,对此 HTTP 处理程序的请求将调用 GetStoresGML 存储过程,并返回包含所有商店的 GeoRSS 订阅源。
8. 在注释If a searchFrom parameter is provided, use GetNearbyStores and add the provided lat and lon coordinates as parameters下,添加以下代码。
Dim searchFrom As String = context.Request.QueryString("SearchFrom")
If Not searchFrom Is Nothing Then
spName = "GetNearbyStoresGML"
Dim latLong() As String = Split(searchFrom, ",", 2)
cmd.Parameters.Add(New SqlParameter("Lat", latLong(0)))
cmd.Parameters.Add(New SqlParameter("Long", latLong(1)))
End If
注意:如果请求包含名为 SearchFrom 的参数(假定它包含以逗号分隔的纬度和经度坐标对),处理程序将从此参数提取纬度和经度值,并使用 GetNearbyStoresGML 存储过程返回 GeoRSS 订阅源,订阅源中包含请求的搜索点周围方圆 100 km 范围内的商店。
9. 在注释 Specify the stored procedure name as the command text(将存储过程名称指定为命令文本)下,添加以下代码。
cmd.CommandText = spName
10. 在注释 Create an element for this row下,添加以下代码来为存储过程的结果中的每一行都创建一个<entry>
rssOutput.AppendLine("<entry>
11. 在注释 Use columns 0 and 1 for the title and description下,添加以下代码以根据存储过程返回的数据创建<title>元素和<description>元素。
rssOutput.AppendLine(String.Format("<title>{0}</title>", geomRdr.GetValue(0)))
rssOutput.AppendLine(String.Format("<description>{0}</description>", _
geomRdr.GetValue(1)))
12. 在注释 Add a<georss:where> element下,添加以下代码来为此条目创建<where> 元素。
rssOutput.AppendLine("<georss:where>")
13. 在注释 Get the geography instance GML from column 2下,添加以下代码,以从存储过程结果中检索 GML 数据。
gml = geomRdr.GetValue(2).ToString()
14. 在注释 Add the <gml:>elements to the output XML下,添加以下代码以向 GeoRSS 订阅源添加 GML 数据。
rssOutput.AppendLine(gml)
15. 在注释 Close <georss:where>and <entry>elements下,添加以下代码。
rssOutput.AppendLine("</georss:where>")
rssOutput.AppendLine("</entry>")
16. 在注释 Close the<feed> document and send it as the response下,添加以下代码以完成 GeoRSS 订阅源并将其发送给请求人。
rssOutput.Append("</feed>")
context.Response.Write(rssOutput.ToString())
17. 保存 GeoRSSHandler.vb。