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