如何在不向服务器写入临时文件或依赖第三方库或类的情况下直接生成 KML 文档并将其返回到浏览器?
问问题
17164 次
1 回答
10
我建议您考虑使用 HTTP 处理程序而不是 ASP.NET 页面。它将更清洁、更高效。只需将“通用处理程序”类型的新项目添加到您的项目中,并考虑将代码移至其ProcessRequest
方法。不过,一般方法很好。
顺便说一句,除非您将.kml
文件显式映射到 ASP.NET 处理程序,否则它无论如何都不会运行。我建议使用默认.ashx
扩展名并添加一个Content-Disposition
HTTP 标头来设置客户端的文件名:
Response.AddHeader("Content-Disposition", "attachment; filename=File.kml");
另外,请注意,您应该在将任何内容发送到客户端之前Content-Type
设置标头内容,因此您应该在其他内容之前移动设置和添加标头。
完整解决方案(来自 OP):
我是这样做的:
服务器
- 将 .kml mimetype 添加到您希望此“文件”所在的文件夹中。说,
\\myDevServer\...\InetPub\KML
(谷歌的说明仅适用于 Apache)Internet Information Services (IIS) Manager
在您的 DEV 服务器上打开- 导航到您的 DEV 站点
- 右键单击
KML
文件夹并选择Properties
- 单击
HTTP Headers
选项卡 - 点击
MIME types
按钮 - 点击
New
- 进入
- 扩展名:.kml
- MIME 类型:application/vnd.google-earth.kml+xml
- 单击
OK
两次以返回HTTP Headers
选项卡
- 将
KML
文件夹设置为 ASP.NET 应用程序(可能是可选的,具体取决于您的服务器的设置方式)- 单击
Directory
选项卡 - 点击
Create
按钮 - 该
Application name
字段通过设置激活KML
- 单击
OK
带您回到主 IIS 管理器窗口
- 单击
网站
- 打开VS2008:
- 文件 >> 新网站
- 选择:
Empty Web Site
- 语:
C#
- 地点:
\\myDevServer\...\InetPub\KML\
- 在
Solution Explorer
- 右键单击该网站
- 选择
New Item
Generic Handler
从Visual Studio installed templates
窗口中选择- 输入一个名字(我用过
MelroseVista.ashx
) - 选择语言:
Visual C#
- 点击
OK
- 粘贴以下代码
//
using System;
using System.Web;
using System.Xml;
public class Handler : IHttpHandler
{
public void ProcessRequest( HttpContext context)
{
context.Response.ContentType = "application/vnd.google-earth.kml+xml";
context.Response.AddHeader("Content-Disposition", "attachment; filename=MelroseVista.kml");
XmlTextWriter kml = new XmlTextWriter(context.Response.OutputStream, System.Text.Encoding.UTF8);
kml.Formatting = Formatting.Indented;
kml.Indentation = 3;
kml.WriteStartDocument();
kml.WriteStartElement("kml", "http://www.opengis.net/kml/2.2");
kml.WriteStartElement("Placemark");
kml.WriteElementString("name", "Melrose Vista FL");
kml.WriteElementString("description", "A nice little town");
kml.WriteStartElement("Point");
kml.WriteElementString("coordinates", "-80.18451400000000000000,26.08816400000000000000,0");
kml.WriteEndElement(); // <Point>
kml.WriteEndElement(); // <Placemark>
kml.WriteEndDocument(); // <kml>
kml.Close();
}
public bool IsReusable
{
get
{
return false;
}
}
}
- 尝试在您喜欢的浏览器中加载您的页面
- 您应该会看到一个弹出窗口,询问您
open
或save
生成的 KML 文件。 - 如果是
open
这样,您应该让 GoogleEarth 自行启动并缩放到佛罗里达州东部的图钉 - 如果是
save
这样,您应该在文件中看到以下内容
\
<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Placemark>
<name>Melrose Vista FL</name>
<description>A nice little town</description>
<Point>
<coordinates>-80.18451400000000000000,26.08816400000000000000,0</coordinates>
</Point>
</Placemark>
</kml>
注意:XmlTextWriter
在这里工作得很好。但是,我认为XMLDocument
较大的 KML 文件看起来更有希望,因为您可以在将其推送给用户之前在内存中对其进行操作。例如,如果您希望同一点出现在 GoogleEarth 位置树的多个文件夹中。
于 2009-06-04T19:41:36.170 回答