web-dev-qa-db-ja.com

asp.net mvcの物理ファイルパスをマップします。

ASP.Net MVCコントローラーのディスクからXSLTファイルを読み取ろうとしています。私がやっていることは次のとおりです:

string filepath = HttpContext.Request.PhysicalApplicationPath;
filepath += "/Content/Xsl/pubmed.xslt";
string xsl = System.IO.File.ReadAllText(filepath);

ただし、 forums.asp.netのこのスレッドの途中 には次の引用があります

HttpContext.Currentは悪であり、mvcアプリのどこかで使用すると、必要ないので何か間違ったことをしていることになります。

私はCurrentを使用していませんが、MVCでファイルの絶対物理パスを決定する最良の方法は何ですか?なんらかの理由で(理由はわかりません!)HttpContextは私にとって適切ではないと感じています。

ASP.Net MVCでディスクからファイルを読み取るためのより良い(または推奨/ベストプラクティス)方法はありますか?

41
Phaedrus
string filePath = Server.MapPath(Url.Content("~/Content/Xsl/"));

HttpContext.Currentは「悪」です。それはすべての問題のハンマーではありませんが、それは確かに、例えば、それがOKを行うことができるもののためのセッションよりも優れています。

75
Craig Stuntz

Web Apiを使用している場合、またはコントローラークラス内で特に使用していない場合は、代わりに次を使用できます。

HostingEnvironment.MapPath("/Content/Xsl/pubmed.xslt")
12
raider33

DIフレームワークによってコントローラーコンストラクターにサイトルートパスを挿入します。

public class HomeController: Controller
{
    private readonly string _siteRoot;
    public HomeController(string siteRoot)
    {
        _siteRoot = siteRoot;
    }

    public ActionResult Index()
    {
        string filePath = Path.Combine(_siteRoot, @"Content\Xsl\pubmed.xslt");
        return File(filePath, "text/xml");
    }
}

サイトのルートパスに関する限り、 HostingEnvironment.ApplicationPhysicalPath staticプロパティで表現できます。

10
Darin Dimitrov