Comment générer un fichier KML dans ASP.NET?
Question
Comment puis-je générer et retourner un document KML directement dans le navigateur sans avoir à écrire un fichier temporaire au serveur ou de compter sur une bibliothèque 3ème partie ou classe?
La solution
Je vous suggère de considérer l'aide d'un gestionnaire HTTP au lieu d'une page ASP.NET. Il sera plus propre et plus performant. Il suffit d'ajouter nouvel élément de type « gestionnaire générique » à votre projet et déplacer le code à sa méthode ProcessRequest
. L'approche générale est bonne, cependant.
Par ailleurs, à moins que vous mappez explicitement les fichiers .kml
à un gestionnaire ASP.NET, ça va pas fonctionner de toute façon. Je suggère d'aller avec l'extension .ashx
par défaut et ajouter un en-tête HTTP Content-Disposition
pour définir le nom du fichier pour le client:
Response.AddHeader("Content-Disposition", "attachment; filename=File.kml");
En outre, notez que vous devez définir des choses d'en-tête avant tout est envoyé au client de sorte que vous devez déplacer la mise en Content-Type
et en ajoutant en-tête avant d'autres choses.
Solution complète (de l'OP):
Voici comment je l'ai fait:
Serveur
- Ajoutez les .kml mimetype dans le dossier où vous voulez que ce « fichier » à vivre. Dites,
\\myDevServer\...\InetPub\KML
( Google instructions sont uniquement pour Apache )- Ouvrir
Internet Information Services (IIS) Manager
sur votre serveur DEV - Accédez à votre site DEV
- Cliquez droit sur le dossier et choisissez
KML
Properties
- Cliquez sur l'onglet
HTTP Headers
- Cliquez sur le bouton
MIME types
- Cliquez
New
- Entrez
- Extension: kml
- Type MIME: application / vnd.google-earth.kml + xml
- Cliquez deux fois
OK
pour revenir à l'ongletHTTP Headers
- Ouvrir
- Définir le dossier
KML
comme une application ASP.NET (peut-être en option selon la façon dont votre serveur est configuré)- Cliquez sur l'onglet
Directory
- Cliquez sur le bouton
Create
- Le champ
Application name
devient actif avec leKML
de réglage - Cliquez
OK
vous ramène à la fenêtre principale du Gestionnaire des services Internet
- Cliquez sur l'onglet
Site
- Ouvrir VS2008:
- Fichier >> Nouveau site web
- Choisissez:
-
Empty Web Site
- Langue:
C#
- Lieu:
\\myDevServer\...\InetPub\KML\
-
- Dans
Solution Explorer
- Rightclick le site
- Choisissez
New Item
- Choisissez
Generic Handler
de la fenêtreVisual Studio installed templates
- Entrez un nom (je
MelroseVista.ashx
) - Choisissez la langue:
Visual C#
- Cliquez
OK
- Collez le code suivant
//
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;
}
}
}
- Essayez de charger votre page dans votre navigateur préféré
- Vous devrait un popup vous demandant de
open
ousave
le fichier KML résultant. - Si vous
open
, vous devrait ont GoogleEarth se lancer et un zoom thumbtack en Floride orientale - Si vous
save
, vous devrait voir ce qui suit dans le fichier
\
<?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>
Note: XmlTextWriter
a plutôt bien ici. Cependant, je pense que XMLDocument
semble plus prometteur pour les fichiers KML plus grands puisque vous pouvez le manipuler en mémoire avant de le pousser à l'utilisateur. Si, par exemple, vous voulez que le même point d'apparaître dans plusieurs dossiers dans l'arborescence Emplacements GoogleEarth.