サーバーに一時ファイルを書き込んだり、サードパーティのライブラリやクラスに依存したりせずに、KMLドキュメントを生成してブラウザに直接返すにはどうすればよいですか?
1 に答える
ASP.NETページの代わりにHTTPハンドラーの使用を検討することをお勧めします。よりクリーンでパフォーマンスが向上します。「GenericHandler」タイプの新しいアイテムをプロジェクトに追加し、コードをそのProcessRequest
メソッドに移動することを検討してください。ただし、一般的なアプローチは適切です。
ちなみに、.kml
ファイルをASP.NETハンドラーに明示的にマッピングしない限り、とにかく実行されません。デフォルトの拡張子を使用し、 HTTPヘッダーを.ashx
追加してクライアントのファイル名を設定することをお勧めします。Content-Disposition
Response.AddHeader("Content-Disposition", "attachment; filename=File.kml");
また、クライアントに何かを送信する前にContent-Type
ヘッダーを設定する必要があるため、他のものの前にヘッダーの設定と追加を移動する必要があることに注意してください。
完全なソリューション(OPから):
これが私がそれをした方法です:
サーバ
- この「ファイル」を配置するフォルダに.kmlmimetypeを追加します。言ってやるがいい
\\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
に戻るには2回クリックしますHTTP Headers
- フォルダをASP.NETアプリケーションとして設定し
KML
ます(サーバーの設定方法によってはオプションの場合があります)Directory
タブをクリックしますCreate
ボタンをクリックしますApplication name
設定によりフィールドがアクティブになりますKML
- クリック
OK
すると、IISマネージャーのメインウィンドウに戻ります。
Webサイト
- VS2008を開く:
- ファイル>>新しいウェブサイト
- 選ぶ:
Empty Web Site
- 言語:
C#
- 位置:
\\myDevServer\...\InetPub\KML\
- の
Solution Explorer
- Webサイトを右クリックします
- 選ぶ
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;
}
}
}
- お気に入りのブラウザでページを読み込もうとします
- または結果のKMLファイルを尋ねるポップアップが表示されます。
open
save
- もしそうなら、
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ファイルをユーザーにプッシュする前にメモリ内で操作できるため、より大きなKMLファイルの方が有望だと思います。たとえば、同じポイントをGoogleEarthの場所ツリーの複数のフォルダに表示する場合。