web-dev-qa-db-ja.com

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

Microsoft Web APIMVCではないので、次のようなことはできません。

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"
219
Zachary Scott

System.WebのようなHttpContext.Currentオブジェクトが利用できないような状況では(---静的メソッドからも)、 HostingEnvironment.MapPath を使用できます。

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

また参照してください Server.MapPathとHostingEnvironment.MapPathの違いは何ですか?

431
StuartLC
string root = HttpContext.Current.Server.MapPath("~/App_Data");
11
ArgeKumandan

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マッピングが必要な場合には、私はそれが役に立つと思います。

2
Nathan Teague

あなたが提供したコンテキストからはわかりませんが、それがアプリの起動時に必要なことであれば、WebApiHttpApplicationServer.MapPathを使用することができます。例えばApplication_Start()にあります。

あなたの直接の質問に答えているだけです。すでに述べたHostingEnvironment.MapPath()がおそらく推奨される解決策です。

1
sellotape

Server.MapPath()はWeb Api(SoapまたはREST)内に存在しないため、Webサーバーのcontext-homeディレクトリに相対的なローカルを示す必要があります。最も簡単な方法は次のとおりです。

string AppContext.BaseDirectory { get;}

その後、これを使用してパス文字列を連結し、相対パスを任意のファイルにマッピングできます。
注:文字列パスは、mvcにあるような\ではなく/です。

例:

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

これがあなたの例のサウンドパスであると仮定して真を返します

0
Guest