Как создать файл KML в ASP.NET? - PullRequest
15 голосов
/ 04 июня 2009

Как мне сгенерировать и вернуть документ KML непосредственно в браузер, не записывая временный файл на сервер или полагаясь на стороннюю библиотеку или класс?

1 Ответ

10 голосов
/ 04 июня 2009

Я предлагаю вам рассмотреть возможность использования обработчика HTTP вместо страницы ASP.NET. Это будет чище и эффективнее. Просто добавьте новый элемент типа «Универсальный обработчик» в свой проект и рассмотрите возможность переноса кода в метод ProcessRequest. Хотя общий подход хорош.

Кстати, если вы явно не сопоставляете .kml файлы с обработчиком ASP.NET, он все равно не запустится. Я предлагаю перейти с расширением .ashx по умолчанию и добавить заголовок HTTP Content-Disposition, чтобы задать имя файла для клиента:

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

Кроме того, обратите внимание, что вы должны установить содержимое заголовка до того, как что-либо будет отправлено клиенту, поэтому вам следует переместить настройку Content-Type и добавить заголовок перед другим материалом.


Полное решение (из ОП):

Вот как я это сделал:

Сервер

  1. Добавьте MIME-тип .kml в папку, где вы хотите, чтобы этот "файл" жил. Скажем, \\myDevServer\...\InetPub\KML
    ( инструкции Google предназначены только для 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 Handler из окна Visual 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. Вы должны получить всплывающее окно с просьбой open или save получившегося файла 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.

...