15

サーバーに一時ファイルを書き込んだり、サードパーティのライブラリやクラスに依存したりせずに、KMLドキュメントを生成してブラウザに直接返すにはどうすればよいですか?

4

1 に答える 1

10

ASP.NETページの代わりにHTTPハンドラーの使用を検討することをお勧めします。よりクリーンでパフォーマンスが向上します。「GenericHandler」タイプの新しいアイテムをプロジェクトに追加し、コードをそのProcessRequestメソッドに移動することを検討してください。ただし、一般的なアプローチは適切です。

ちなみに、.kmlファイルをASP.NETハンドラーに明示的にマッピングしない限り、とにかく実行されません。デフォルトの拡張子を使用し、 HTTPヘッダーを.ashx追加してクライアントのファイル名を設定することをお勧めします。Content-Disposition

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

また、クライアントに何かを送信する前にContent-Typeヘッダーを設定する必要があるため、他のものの前にヘッダーの設定と追加を移動する必要があることに注意してください。


完全なソリューション(OPから):

これが私がそれをした方法です:

サーバ

  1. この「ファイル」を配置するフォルダに.kmlmimetypeを追加します。言ってやるがいい\\myDevServer\...\InetPub\KML
    Googleの指示はApache専用
    1. Internet Information Services (IIS) ManagerDEVサーバーで開きます
    2. DEVサイトに移動します
    3. KMLフォルダを右クリックして、Properties
    4. HTTP Headersタブをクリックします
    5. MIME typesボタンをクリックします
    6. クリックNew
    7. 入る
      • 拡張子:.kml
      • MIMEタイプ:application / vnd.google-earth.kml + xml
    8. タブOKに戻るには2回クリックしますHTTP Headers
  2. フォルダをASP.NETアプリケーションとして設定しKMLます(サーバーの設定方法によってはオプションの場合があります)
    1. Directoryタブをクリックします
    2. Createボタンをクリックします
    3. Application name設定によりフィールドがアクティブになりますKML
    4. クリックOKすると、IISマネージャーのメインウィンドウに戻ります。

Webサイト

  1. VS2008を開く:
    1. ファイル>>新しいウェブサイト
    2. 選ぶ:
      • Empty Web Site
      • 言語:C#
      • 位置:\\myDevServer\...\InetPub\KML\
  2. Solution Explorer
    1. Webサイトを右クリックします
    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. または結果のKMLファイルを尋ねるポップアップが表示されますopensave
  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ファイルをユーザーにプッシュする前にメモリ内で操作できるため、より大きなKMLファイルの方が有望だと思います。たとえば、同じポイントをGoogleEarthの場所ツリーの複数のフォルダに表示する場合。

于 2009-06-04T19:41:36.170 に答える