Я предлагаю вам рассмотреть возможность использования обработчика HTTP вместо страницы ASP.NET. Это будет чище и эффективнее. Просто добавьте новый элемент типа «Универсальный обработчик» в свой проект и рассмотрите возможность переноса кода в метод ProcessRequest
. Хотя общий подход хорош.
Кстати, если вы явно не сопоставляете .kml
файлы с обработчиком ASP.NET, он все равно не запустится. Я предлагаю перейти с расширением .ashx
по умолчанию и добавить заголовок HTTP Content-Disposition
, чтобы задать имя файла для клиента:
Response.AddHeader("Content-Disposition", "attachment; filename=File.kml");
Кроме того, обратите внимание, что вы должны установить содержимое заголовка до того, как что-либо будет отправлено клиенту, поэтому вам следует переместить настройку Content-Type
и добавить заголовок перед другим материалом.
Полное решение (из ОП):
Вот как я это сделал:
Сервер
- Добавьте MIME-тип .kml в папку, где вы хотите, чтобы этот "файл" жил. Скажем,
\\myDevServer\...\InetPub\KML
( инструкции Google предназначены только для 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.