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 なし)