如何在不编写临时文件到服务器或依赖第三方库或类的情况下直接生成并将KML文档返回给浏览器?
我建议你考虑使用HTTP Handler而不是ASP.NET页面,这样会更加简洁和高效。只需将类型为"通用处理程序"的新项添加到项目中,并考虑将代码移动到其ProcessRequest
方法中。尽管一般方法是好的。
顺便说一句,除非你明确将.kml
文件映射到ASP.NET处理程序,否则它不会运行。我建议使用默认的.ashx
扩展名,并添加一个Content-Disposition
HTTP头来设置客户端的文件名:
Response.AddHeader("Content-Disposition", "attachment; filename=File.kml");
另外,请注意,应该在向客户端发送任何内容之前设置标题信息,因此您应该在其他内容之前移动设置Content-Type和添加标头。
完整解决方案(来自OP):
这是我是如何做到的:
\\myDevServer\...\InetPub\KML
Internet Information Services (IIS) Manager
KML
文件夹并选择 属性
HTTP 标头
选项卡MIME 类型
按钮New
OK
按钮两次以返回 HTTP Headers
选项卡KML
文件夹设置为 ASP.NET 应用程序(根据您的服务器设置情况可能是可选的)
目录
选项卡Create
按钮Application name
字段变为活动状态,并带有设置 KML
OK
按钮,将您带回到主 IIS Manager 窗口空网站
C#
\\myDevServer\...\InetPub\KML\
Solution Explorer
中
New Item
Visual Studio 安装模板
窗口中选择 Generic Handler
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;
}
}
}
打开
或保存
生成的KML文件。打开
,则应该会启动GoogleEarth并缩放到佛罗里达州东部的图钉位置。保存
,则应该会在文件中看到以下内容:\
<?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
效果非常好。 但是,我认为对于更大的KML文件来说,XMLDocument
看起来更加有前途,因为您可以在将其推送给用户之前在内存中操纵它。例如,如果您希望同一点出现在Google Earth位置树中的多个文件夹中。