4

私は本当の悪夢を見ましたServer.MapPath()。ASP.NET Development Server で実行されているアプリケーションを呼び出すServer.MapPath("~")と、 のようなバック スラッシュで終わるルート ディレクトリが返さf:\projects\app1\れますが、IIS にインストールされた公開バージョンで呼び出すと、 のようなバック スラッシュなしでルート ディレクトリが返されますc:\inetpub\wwwroot\app1。なぜこれが起こるのですか?どうすれば回避できますか?

同じマシンで 2 つのシナリオを実行しました: Windows Server 2008 R2 x64、Visual Studio 2010 x64、IIS 7。

アップデート:

なぜ私はそれを気にするのですか?ファイル/フォルダー構造に基づいてカスタム サイト マップ プロバイダーを作成しました。ルート ディレクトリのファイル/フォルダのリストを抽出"~"し、ルート ディレクトリ セクションを置き換えて、ASP.NETコントロールで使用するファイルのServer.MapPath("~")URL を生成します。次のコードは、私がやっていることを説明していると思います:.aspxMenu

    string mainRoot = HttpContext.Current.Server.MapPath("~");

    DirectoryInfo di = new DirectoryInfo(mainRoot); 

    //added to solve this problem with Server.MapPath
    if (!mainRoot.EndsWith(@"\"))
        mainRoot += @"\";


    FileInfo[] files = di.GetFiles("*.aspx");
    foreach (FileInfo item in files)
    {
        string path = item.FullName.Replace(mainRoot, "~/").Replace(@"\", "/");

        //do more here
    }
4

1 に答える 1

7

設定時に末尾のスラッシュを使用したかどうかによっては、IIS 内で仮想ディレクトリを設定したときから発生する可能性があります。

しかし、それは本当に重要ですか?Server.MapPath("~")なぜあなたは何を返すかさえ気にするのですか?あなたがそのようにそれを使うとは想像できません。アプリケーションの何かへのパスが実際に必要な場合は、より可能性が高くなります。

Server.MapPath("~/Something/Foo.txt");

さらに、パスを構築するときはいつでも、Path.Combineを使用する習慣を身につけようとする必要があります。これは、末尾のスラッシュについてまったく心配する必要がないためです。

string fullPath = Path.Combine(Server.MapPath("~"), @"Something\Foo.txt");
于 2010-07-01T05:59:14.807 に答える