Comment puis-je générer un fichier KML dans ASP.NET?
Comment puis-je générer et renvoyer un document KML directement dans le navigateur sans l'écriture d'un fichier temporaire sur le serveur ou en s'appuyant sur une 3ème partie de la bibliothèque ou de la classe?
Je vous suggère d'envisager l'utilisation d'un Gestionnaire HTTP au lieu d'un ASP.NET page. Il sera plus propre et plus performant. Juste ajouter un nouvel élément de type "Générique Gestionnaire" à votre projet et à envisager de déplacer le code de son ProcessRequest méthode. L'approche générale est bonne, bien qu'.
Par le chemin, sauf si vous explicitement cartographie .kml des fichiers à une ASP.NET gestionnaire, il va pas fonctionner de toute façon. Je suggère d'aller avec la valeur par défaut .ashx extension et ajouter un Content-Disposition en-tête HTTP pour définir le nom de fichier pour le client:
Notez également que vous devez définir l'en-tête des trucs avant rien n'est envoyé au client de sorte que vous devrait aller de réglage Content-Type et l'ajout d'en-tête de avant que d'autres trucs.
Complète de la Solution (à Partir de l'OP):
Voici comment je l'ai fait:
Serveur
Ajouter l' .kml type mime le dossier où vous voulez que ce "fichier" de vivre. Dire, \\myDevServer\...\InetPub\KML
Ouvrir Internet Information Services (IIS) Manager sur votre serveur de DEV
Accédez à votre site DEV
Cliquez-droit sur le KML dossier et choisissez Properties
Cliquez sur le HTTP Headers onglet
Cliquez sur le MIME types bouton
Cliquez sur New
Entrer
Extension: .kml
Type MIME: application/vnd.google-earth.kml+xml
Cliquez sur OK deux fois pour revenir à l' HTTP Headers onglet
Définir la KML dossier comme un ASP.NET application (peut-être que facultatif, en fonction de la façon dont votre serveur est configuré)
Cliquez sur le Directory onglet
Cliquez sur le Create bouton
La Application name champ devient active avec la mise en KML
Cliquez sur OK reprenant le principal Gestionnaire des services IIS fenêtre
Site web
Ouvrir VS2008:
Fichier >> Nouveau Site web
Choisir:
Empty Web Site
Langue: C#
Emplacement: \\myDevServer\...\InetPub\KML\
Dans Solution Explorer
Faites clic droit sur le site web
Choisir New Item
Choisir Generic Handler de la Visual Studio installed templates fenêtre
Entrez un nom (j'ai utilisé MelroseVista.ashx )
Choisir La Langue: Visual C#
Cliquez sur OK
Collez le code suivant
//
using System;
using System.Web;
using System.Xml;publicclassHandler:IHttpHandler{publicvoidProcessRequest(HttpContext context){
context.Response.ContentType="application/vnd.google-earth.kml+xml";
context.Response.AddHeader("Content-Disposition","attachment; filename=MelroseVista.kml");XmlTextWriter kml =newXmlTextWriter(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();}publicboolIsReusable{
get
{returnfalse;}}}
Tentative de chargement de votre page dans votre navigateur préféré
Vous devrait obtenir un popup vous demandant de open ou save l'résultant fichier KML.
Si vous open, vous devrait ont GoogleEarth lancer lui-même et de zoom à une forme de punaise dans l'est de la Floride
Si vous save, vous devrait voir le suivant dans le fichier
\
<?xml version="1.0" encoding="utf-8"?><kml xmlns="http://www.opengis.net/kml/2.2"><Placemark><name>MelroseVista FL</name><description>A nice little town</description><Point><coordinates>-80.18451400000000000000,26.08816400000000000000,0</coordinates></Point></Placemark></kml>
Remarque: XmlTextWriter a fonctionné assez bien ici. Cependant, je pense que XMLDocument semble plus prometteuse pour les gros fichiers KML puisque vous pouvez le manipuler dans la mémoire avant de le pousser à l'utilisateur. Si, par exemple, vous voulez le même point de faire apparaître dans plusieurs dossiers dans le GoogleEarth Endroits de l'arbre.
Je vais regarder dans l'aide d'un gestionnaire HTTP merci. Avez-vous un favori, exemple précis? En supposant que je vais avec ce que j'ai, voulez-vous me diriger vers une réponse #2 ci-dessus? Mon fond est principalement perl piratage et je vais avoir du mal à obtenir ma tête autour de l'intégration du code-behind de la page, le navigateur demande. hmm... les commentaires ne préservent pas la verticale de l'espace 🙁 Vous n'avez pas besoin d'un exemple. Juste un clic droit sur le projet -> Ajouter un nouvel élément -> Generic Gestionnaire. Il va créer un modèle pour vous. Copier et coller le code dans le Page_Load ci-dessus pour la méthode ProcessRequest. La seule chose que vous avez besoin de changement est l'ajout d'un "var Response = contexte.Réponse" au début de la méthode. J'en ai trouvé un de toute façon: stackoverflow.com/questions/873207/...
Je vous suggère d'envisager l'utilisation d'un Gestionnaire HTTP au lieu d'un ASP.NET page. Il sera plus propre et plus performant. Juste ajouter un nouvel élément de type "Générique Gestionnaire" à votre projet et à envisager de déplacer le code de son
ProcessRequest
méthode. L'approche générale est bonne, bien qu'.Par le chemin, sauf si vous explicitement cartographie
.kml
des fichiers à une ASP.NET gestionnaire, il va pas fonctionner de toute façon. Je suggère d'aller avec la valeur par défaut.ashx
extension et ajouter unContent-Disposition
en-tête HTTP pour définir le nom de fichier pour le client:Notez également que vous devez définir l'en-tête des trucs avant rien n'est envoyé au client de sorte que vous devrait aller de réglage
Content-Type
et l'ajout d'en-tête de avant que d'autres trucs.Complète de la Solution (à Partir de l'OP):
Voici comment je l'ai fait:
Serveur
\\myDevServer\...\InetPub\KML
(Google instructions sont uniquement pour Apache)
Internet Information Services (IIS) Manager
sur votre serveur de DEVKML
dossier et choisissezProperties
HTTP Headers
ongletMIME types
boutonNew
OK
deux fois pour revenir à l'HTTP Headers
ongletKML
dossier comme un ASP.NET application (peut-être que facultatif, en fonction de la façon dont votre serveur est configuré)Directory
ongletCreate
boutonApplication name
champ devient active avec la mise enKML
OK
reprenant le principal Gestionnaire des services IIS fenêtreSite web
Empty Web Site
C#
\\myDevServer\...\InetPub\KML\
Solution Explorer
New Item
Generic Handler
de laVisual Studio installed templates
fenêtreMelroseVista.ashx
)Visual C#
OK
//
open
ousave
l'résultant fichier KML.open
, vous devrait ont GoogleEarth lancer lui-même et de zoom à une forme de punaise dans l'est de la Floridesave
, vous devrait voir le suivant dans le fichier\
Remarque:
XmlTextWriter
a fonctionné assez bien ici. Cependant, je pense queXMLDocument
semble plus prometteuse pour les gros fichiers KML puisque vous pouvez le manipuler dans la mémoire avant de le pousser à l'utilisateur. Si, par exemple, vous voulez le même point de faire apparaître dans plusieurs dossiers dans le GoogleEarth Endroits de l'arbre.hmm... les commentaires ne préservent pas la verticale de l'espace 🙁
Vous n'avez pas besoin d'un exemple. Juste un clic droit sur le projet -> Ajouter un nouvel élément -> Generic Gestionnaire. Il va créer un modèle pour vous. Copier et coller le code dans le Page_Load ci-dessus pour la méthode ProcessRequest. La seule chose que vous avez besoin de changement est l'ajout d'un "var Response = contexte.Réponse" au début de la méthode. J'en ai trouvé un de toute façon: stackoverflow.com/questions/873207/...
OriginalL'auteur Mehrdad Afshari