LoginSignup
2
3

More than 5 years have passed since last update.

ASP.NET MVC サービスで物理パスを取得する

Last updated at Posted at 2016-07-14

ASP.NET MVC サービスで物理パスを取得する

困って、試した順に書いてしまったので長い。結論はこうだ。

using System.Web.Hosting;

var physicalPath = HostingEnvironment.MapPath(絶対パス or 相対パス);

2016-08-13 追記

アクションフィルタなら、このあたりを使ってもよさそう。

filterContext.HttpContext.Request.PhysicalApplicationPath
filterContext.HttpContext.Request.PhysicalPath

以下、経緯につき冗長

ビューで

Razor 他を使ってアプリケーションの絶対パスを取得するには @Url.Content("~/Content/Site.css") とすればよい。

[BuildInsider] アプリケーションルートからの絶対パスを生成する - Url.Content/Action/RouteUrlメソッド[Razor]

コントローラで

次の方法で絶対パスを取得できる。

using System.Web

string returnUrl = VirtualPathUtility.ToAbsolute("~/stuff/");

[stackoverflow] how to use Url.Content(“~\stuff\hi.jpg”) in controller's code?

サービスで

今回はコントローラが呼び出すビジネスロジック -ここではサービスと呼ぶけれども- で取得したい。

  • コントローラがサービスに HttpContext を引き渡す、というのは違うだろう。
  • コントローラでパスを取得して、サービスに渡す、というのもピンとこない。

悩むなら、まずコントローラで取得しようと試したが、VirtualPathUtility.ToAbsolute() は、期待どおり動作しない。

念のため、@Url.Content() を試したが、こちらも「私の求めるパス」を返さない。

ここに至って、ようやく「絶対パス」ではなくて、「物理パス」が欲しかったんだと気付く。

探すものが間違ってたら見つからない。

確認した環境

  • ASP.NET MVC 5
  • Visual Studio 2015 Community
  • Windows 10 (Insider Preview なし)
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3