15

如何在不向服务器写入临时文件或依赖第三方库或类的情况下直接生成 KML 文档并将其返回到浏览器?

4

1 回答 1

10

我建议您考虑使用 HTTP 处理程序而不是 ASP.NET 页面。它将更清洁、更高效。只需将“通用处理程序”类型的新项目添加到您的项目中,并考虑将代码移至其ProcessRequest方法。不过,一般方法很好。

顺便说一句,除非您将.kml文件显式映射到 ASP.NET 处理程序,否则它无论如何都不会运行。我建议使用默认.ashx扩展名并添加一个Content-DispositionHTTP 标头来设置客户端的文件名:

Response.AddHeader("Content-Disposition", "attachment; filename=File.kml");

另外,请注意,您应该在将任何内容发送到客户端之前Content-Type设置标头内容,因此您应该在其他内容之前移动设置和添加标头。


完整解决方案(来自 OP):

我是这样做的:

服务器

  1. 将 .kml mimetype 添加到您希望此“文件”所在的文件夹中。说,\\myDevServer\...\InetPub\KML
    谷歌的说明仅适用于 Apache
    1. Internet Information Services (IIS) Manager在您的 DEV 服务器上打开
    2. 导航到您的 DEV 站点
    3. 右键单击KML文件夹并选择Properties
    4. 单击HTTP Headers选项卡
    5. 点击MIME types按钮
    6. 点击New
    7. 进入
      • 扩展名:.kml
      • MIME 类型:application/vnd.google-earth.kml+xml
    8. 单击OK两次以返回HTTP Headers选项卡
  2. KML文件夹设置为 ASP.NET 应用程序(可能是可选的,具体取决于您的服务器的设置方式)
    1. 单击Directory选项卡
    2. 点击Create按钮
    3. Application name字段通过设置激活KML
    4. 单击OK带您回到主 IIS 管理器窗口

网站

  1. 打开VS2008:
    1. 文件 >> 新网站
    2. 选择:
      • Empty Web Site
      • 语:C#
      • 地点:\\myDevServer\...\InetPub\KML\
  2. Solution Explorer
    1. 右键单击该网站
    2. 选择New Item
    3. Generic HandlerVisual Studio installed templates窗口中选择
    4. 输入一个名字(我用过MelroseVista.ashx
    5. 选择语言:Visual C#
    6. 点击OK
  3. 粘贴以下代码

//

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;
        }
    }
}
  1. 尝试在您喜欢的浏览器中加载您的页面
  2. 应该会看到一个弹出窗口,询问您opensave生成的 KML 文件。
  3. 如果是open这样,您应该让 GoogleEarth 自行启动并缩放到佛罗里达州东部的图钉
  4. 如果是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 回答