Microsoft Web API:Server.MapPathをどのように実行しますか?


239

以来、マイクロソフトのWeb APIがないMVC、あなたはこのような何かを行うことはできません。

var a = Request.MapPath("~");

これも

var b = Server.MapPath("~");

これらはSystem.Web名前空間ではなく名前空間の下にあるからSystem.Web.Httpです。

それでは、Web APIでサーバーの相対パスをどのように把握しますか?
私はMVCでこのようなことをしていました:

var myFile = Request.MapPath("~/Content/pics/" + filename);

これにより、ディスク上の絶対パスがわかります。

"C:\inetpub\wwwroot\myWebFolder\Content\pics\mypic.jpg"

回答:


469

HostingEnvironment.MapPathは、次のような任意のコンテキストで使用できます。System.Webオブジェクトが好きなHttpContext.Current(静的メソッドからも、例えば)は使用できません。

var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");

関連項目Server.MapPathとHostingEnvironment.MapPathの違いは何ですか?


1
これはすばらしいですが、HostingEnvironmentは静的クラスインスタンスであるため、簡単にモックする方法はありません... :-(
Josh G

6
もちろん、テストしたいコントローラーまたはその他のロジックレイヤーでは、次のような独自の抽象化への依存関係のみを取得しますIPathMapper(おそらく、これを他の多くの懸念事項とともに、より大きなツールベルト/ユーティリティインターフェイスにまとめます)。メソッドでstring MapPath(string virtualPath)WebApi IPathMapper知っておく必要がある具体的な実装のみSystem.Web.Hosting.HostingEnvironment
StuartLC

1
@JoshG-Func <string、string> GetWebPath = HostingEnvironment.MapPathを介してHostingEnvironment.MapPathを抽象化し、モックでテスト時にGetWebPathを上書きできます。
Sean B

これは、次のような相対パスで問題が発生しているように見えます../images/
AaA 2018

コントローラパスを与えるので、「HostingEnvironment」を使用してサービスパスを取得できますか?
Md Aslam 2018

13
string root = HttpContext.Current.Server.MapPath("~/App_Data");

16
WebAPIでHttpContext.Currentを使用したくない。自己ホスト型APIについてはどうですか?HttpContext.Currentに依存することはできません。また、テストフレンドリーではありません。
Trevor de Koekkoek 2014年

2

HostingEnvironment呼び出しを使用してテストレベルを実行する1つの優れた方法は、これに出くわすことを別にして、たとえばUNC共有にアクセスする場合です。 IIS-Expressの問題:

#if DEBUG
    var fs = new FileStream(@"\\example\file",FileMode.Open, FileAccess.Read);
#else
    var fs = new FileStream(HostingEnvironment.MapPath("~/example/file"), FileMode.Open, FileAccess.Read);
#endif

ファイルをローカルでテストする権限はあるが、本番環境でenvマッピングが必要な場合に役立ちます。


Fyi、HostingEnvironmentクラスはSystem.Web.Hosting名前空間にあります。
ダーモット

2
HostingEnvironment DNXコア5.0に代わるものは何ですか?
roydukkey

新しいStartup.csクラスは、構築時にpublic Startup(IHostingEnvironment env){}を注入するようになりました。インスタンスごとに環境を制御することもできます。#ifディレクティブを使用すると、複数の環境で簡単にクロスティアデプロイできるアプリを構築できます。
Nathan Teague、2015年

1

私はあなたが提供する文脈から言うことはできませんが、あなただけのアプリの起動時に実行する必要があり、それの何かあれば、あなたはまだ使用することができますServer.MapPathWebApiHttpApplication。例えばApplication_Start()

私はあなたの直接の質問に答えているだけです。すでに述べたことHostingEnvironment.MapPath()がおそらく好ましい解決策です。


0

以来Server.MapPath()のWeb API(SOAPまたはREST)内に存在しない、あなたは、Webサーバの、コンテキストホームディレクトリにローカルからの相対を意味する必要があります。これを行う最も簡単な方法は次のとおりです。

string AppContext.BaseDirectory { get;}

次に、これを使用してパス文字列を連結し、相対パスを任意のファイルにマップできます。
注:文字列のパスは\ありません/、彼らはMVCにいるような。

例:

System.IO.File.Exists($"{**AppContext.BaseDirectory**}\\\\Content\\\\pics\\\\{filename}");

これがあなたの例では健全な道であるという真の仮定を返します


-1

選択した回答がWeb APIアプリケーションで機能しませんでした。私は使用しなければなりませんでした

System.Web.HttpRuntime.AppDomainAppPath

1
それは、これはあなたがあなたのWEBAPIアプリへのパスを取得することができる唯一の方法であると思われるが、これはあなたのアプリケーションのルートを与えるが、のような相対パス変換しない~\folderか、../images/物理パスへの
AAA

-1

あなたは次のように試すことができます:

var path = "〜/ Image / test.png"; System.Web.Hosting.HostingEnvironment.MapPath(@ +パス)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.