1

私の MVC3 Web アプリケーションは常に IIS のサイトとして展開されるとは限らないため、パス文字列を処理するために仮想ディレクトリまたはアプリケーションとして展開されているかどうかを検出する必要があります。

たとえば、サイトが IIS ルートの下に Web サイトとして展開されている場合、次のように記述します。

\ABC\test.txt

これで問題ありません。リクエストはhttp://somehost/ABC/test.txt

ただし、サイトが IIS の既存のサイトの下に仮想ディレクトリまたはアプリケーションとして展開されている場合は、次のようになります。

http://somehost/mymvcapp/

その場合、「\ABC\test.txt」の要求は正しくありません。

「~\App_Data\test.txt」と書くと問題が解決することは理解していますが、「~\」は現在の Web コンテキストのサーバーでしか処理できません。他のレイヤーのファイルに対して何らかのプロセスを実行する必要がある場合がありますが、それらは Web コンテキストに触れることができません。

そのため、アプリケーションが仮想ディレクトリとしてデプロイされているかどうかを検出する必要があります。ファイルへの実際の物理パスを見つけます。それを行う方法はありますか?

4

2 に答える 2

3

方法を見つけましたが、それが良いかどうかはわかりません。

小切手HttpRuntime.AppDomainAppVirtualPath == "/"

于 2012-08-02T02:40:02.777 に答える
1

ビジネス層が を参照できない場合System.Web、Web アプリケーション期間に関する情報を検出できないことを予期する必要があります。これは、コードがサイト内のファイル パスを解決することを期待すべきではないことを意味します。

代わりにできることは、アプリケーションが初期化し、ビジネス層が消費できる中間構成層を持つことです。たとえば、両方のレイヤーにアクセスできる次のインターフェイスがあるとします。

public interface IConfiguration
{
    string DataFolder { get; }
}

...あなたはGlobal.asaxそれを初期化するコードを持つことができます:

IConfiguration config = ...;
...
config.DataFolder = this.Server.MapPath("~/App_Data");

ビジネス層は、構成を読み取って、期待されるファイルへのパスを形成できるようになりました。

var filePath = Path.Combine(this.configuration.DataFolder, "test.txt");
于 2012-08-02T02:35:01.357 に答える