ASP.NETとIISで、「〜/ content」の形式の仮想パスがある場合、 MapPath メソッドを使用してこれを物理的な場所に解決できます。
HttpContext.Server.MapPath("~/content");
OWINホストの下の物理的な場所への仮想パスをどのように解決できますか?
AppDomain.CurrentDomain.SetupInformation.ApplicationBase を使用して、アプリケーションのルートを取得できます。ルートパスを使用すると、Owinの「MapPath」を実装できます。
私はまだ別の方法を知りません。 (ApplicationBase
プロパティは Microsoft.Owin.FileSystems.PhysicalFileSystem でも使用されます。)
_HttpContext.Server
_はMVCでのみ使用できるため、使用しないでください。 HostingEnvironment.MapPath()
はその方法です。ただし、セルフホスティングowinでは使用できません。したがって、直接取得する必要があります。
_var path = HostingEnvironment.MapPath("~/content");
if (path == null)
{
var uriPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
path = new Uri(uriPath).LocalPath + "/content";
}
_
OWINセルフホスト(System.Webなし)でAPIを実行しています。この問題が発生し、リストを保持するテキストファイルを読み込む必要がありました。
これは私のために働き、同僚から発見されました-config.textは私のルートのweb.configの隣にあります:
var path = AppDomain.CurrentDomain.BaseDirectory + "/config.txt";
ASP.NET Coreで機能する別の回答を追加します。 IHostingEnvironmentというサービスがあり、フレームワークによって追加されます。
public class ValuesController : Controller
{
private IHostingEnvironment _env;
public ValuesController(IHostingEnvironment env)
{
_env = env;
}
public IActionResult Get()
{
var webRoot = _env.WebRootPath;
var file = Path.Combine(webRoot, "test.txt");
File.WriteAllText(file, "Hello World!");
return OK();
}
}
あなたは関数のいくつかの異なる実装を持っているかもしれません
Func<string, string>
キーのような異なる起動コードによって提供されます
"Host.Virtualization.MapPath"
oWINディクショナリに入れます。または、このような基本的なクラスを作成できます
public abstract class VirtualPathResolver {
string MapPath(string virtualPath);
}
構成設定、コマンドラインパラメータ、または環境変数のいずれかで実装を選択します。
承認された回答であるAppDomain.CurrentDomain.SetupInformation.ApplicationBaseは、dnx/kestrelでは機能しませんでした-.dnxランタイムの場所が返され、webappルートが返されませんでした。
これはOWINスタートアップの中で私にとってうまくいったものです:
public void Configure(IApplicationBuilder app)
{
app.Use(async (ctx, next) =>
{
var hostingEnvironment = app.ApplicationServices.GetService<IHostingEnvironment>();
var realPath = hostingEnvironment.WebRootPath + ctx.Request.Path.Value;
// so something with the file here
await next();
});
// more owin setup
}