C# 如何在ASP.NET中生成KML文件? 我如何生成和返回KML文档直接到浏览器,而不向服务器写入临时文件或依赖于第三方库或类? < P>我建议您考虑使用HTTP处理程序而不是ASP.NET页面。它会更干净,性能更好。只需将新类型的“泛型处理程序”添加到项目中,并考虑将代码移动到其“代码> PurrestRebug < /代码>方法。不过,一般的做法是好的

C# 如何在ASP.NET中生成KML文件? 我如何生成和返回KML文档直接到浏览器,而不向服务器写入临时文件或依赖于第三方库或类? < P>我建议您考虑使用HTTP处理程序而不是ASP.NET页面。它会更干净,性能更好。只需将新类型的“泛型处理程序”添加到项目中,并考虑将代码移动到其“代码> PurrestRebug < /代码>方法。不过,一般的做法是好的,c#,asp.net,kml,C#,Asp.net,Kml,顺便说一下,除非您将.kml文件显式映射到ASP.NET处理程序,否则它不会运行。我建议使用默认的.ashx扩展名,并添加内容配置HTTP头来设置客户端的文件名: Response.AddHeader("Content-Disposition", "attachment; filename=File.kml"); 另外,请注意,您应该在将任何内容发送到客户端之前设置标题,以便移动设置内容类型,并在其他内容之前添加标题 完整解决方案(来自OP): 我是这样做的: 服务器 将.kml mimet

顺便说一下,除非您将
.kml
文件显式映射到ASP.NET处理程序,否则它不会运行。我建议使用默认的
.ashx
扩展名,并添加
内容配置
HTTP头来设置客户端的文件名:

Response.AddHeader("Content-Disposition", "attachment; filename=File.kml");
另外,请注意,您应该在将任何内容发送到客户端之前设置标题,以便移动设置
内容类型
,并在其他内容之前添加标题


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

我是这样做的:

服务器
  • 将.kml mimetype添加到此“文件”所在的文件夹。比如说,
    \\myDevServer\…\InetPub\KML

    ()
  • 在开发服务器上打开Internet信息服务(IIS)管理器
  • 导航到您的开发站点
  • 右键单击
    KML
    文件夹并选择
    Properties
  • 单击
    HTTP标题
    选项卡
  • 单击
    MIME类型
    按钮
  • 单击
    New
  • 进入
    • 扩展名:.kml
    • MIME类型:application/vnd.googleearth.kml+xml
  • 单击两次
    OK
    返回到
    HTTP标题
    选项卡
  • KML
    文件夹设置为ASP.NET应用程序(可能是可选的,具体取决于服务器的设置方式)
  • 单击
    目录
    选项卡
  • 单击
    创建
    按钮
  • 通过设置
    KML
  • 单击
    OK
    返回IIS管理器主窗口
  • 网站
  • 开放VS2008:
  • 文件>>新网站
  • 选择:
    • 空网站
    • 语言:
      C#
    • 位置:
      \\myDevServer\…\InetPub\KML\
  • 解决方案资源管理器中
  • 右键单击该网站
  • 选择新项目
  • Visual Studio安装的模板
    窗口中选择
    Generic Handler
  • 输入名称(我使用了
    MelroseVista.ashx
  • 选择语言:
    visualc
  • 单击
    OK
  • 粘贴以下代码
  • //


    注意:
    XmlTextWriter
    在这里工作得很好。但是,我认为
    XMLDocument
    对于更大的KML文件更具前景,因为您可以在将其推给用户之前在内存中对其进行操作。例如,如果您希望同一点出现在Google Earth位置树的多个文件夹中。

    我将使用HTTP处理程序进行研究,谢谢。你有最喜欢的、具体的例子吗?假设我最终选择了我所拥有的,你能告诉我上面的答案吗?我的背景主要是perl黑客,我很难将代码集成到浏览器要求的实际页面中。嗯。。。注释不保留垂直空格:-(您不需要示例。只需右键单击项目->添加新项->通用处理程序。它将为您创建一个模板。将上面加载的页面中的代码复制并粘贴到ProcessRequest方法。您只需更改添加“var Response=context.Response”在方法的开头,我找到了一个:
    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;
            }
        }
    }
    
    <?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>