Microsoft 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"
System.Web
のようなHttpContext.Current
オブジェクトが利用できないような状況では(---静的メソッドからも)、 HostingEnvironment.MapPath を使用できます。
var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");
また参照してください Server.MapPathとHostingEnvironment.MapPathの違いは何ですか?
string root = HttpContext.Current.Server.MapPath("~/App_Data");
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マッピングが必要な場合には、私はそれが役に立つと思います。
あなたが提供したコンテキストからはわかりませんが、それがアプリの起動時に必要なことであれば、WebApiHttpApplication
でServer.MapPath
を使用することができます。例えばApplication_Start()
にあります。
あなたの直接の質問に答えているだけです。すでに述べたHostingEnvironment.MapPath()
がおそらく推奨される解決策です。
Server.MapPath()
はWeb Api(SoapまたはREST)内に存在しないため、Webサーバーのcontext-homeディレクトリに相対的なローカルを示す必要があります。最も簡単な方法は次のとおりです。
string AppContext.BaseDirectory { get;}
その後、これを使用してパス文字列を連結し、相対パスを任意のファイルにマッピングできます。
注:文字列パスは、mvcにあるような\
ではなく/
です。
例:
System.IO.File.Exists($"{**AppContext.BaseDirectory**}\\\\Content\\\\pics\\\\{filename}");
これがあなたの例のサウンドパスであると仮定して真を返します