Как создать файл KML в ASP.NET?

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

Ответы

Ответ 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.

Ответ 2

Я бы рекомендовал использовать общий обработчик, а не страницу