291

ASP.NET MVCプロジェクトのコントローラーからApp_Dataフォルダーへの絶対パスを見つける正しい方法は何ですか?一時的に.xmlファイルを操作できるようにしたいのですが、パスをハードコーディングしたくありません。

これは動作しません:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");

        //.... do whatever 

        return View();
    }

}

Webコンテキストの外では、VirtualPathUtility.ToAbsolute()は機能しないと思います。文字列パスは「C:\ App_Data\somedata.xml」として返されます

MVCアプリの.xmlファイルのパスはどこで確認する必要がありますか?global.asaxを適用して、アプリケーションレベルの変数に固定しますか?

4

8 に答える 8

412

ASP.NET MVC1-> MVC3

string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");

ASP.NET MVC4

string path = Server.MapPath("~/App_Data/somedata.xml");


MSDNリファレンス:

HttpServerUtility.MapPathメソッド

于 2009-08-12T21:12:37.517 に答える
277
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();

これはおそらく、それを取得するためのより「正しい」方法です。

于 2010-11-22T09:13:56.887 に答える
144

WCF サービスのコンテキスト内でも機能するため、HostingEnvironment代わりに使用する習慣を身につけようとしています。Server

 HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");
于 2010-04-10T10:27:56.633 に答える
9

最も正しい方法は、 を使用することHttpContext.Current.Server.MapPath("~/App_Data");です。これは、 が利用可能なメソッドからのみパスを取得できることを意味しますHttpContext。それは理にかなっています: App_Data ディレクトリは Web プロジェクトのフォルダー構造です [1]。

アクセスできないクラスから ~/App_Data へのパスが必要な場合はHttpContext、IoC コンテナーを使用してプロバイダー インターフェイスをいつでも挿入できます。

public interface IAppDataPathProvider
{
    string GetAppDataPath();
}

を使用して実装しますHttpApplication

public class AppDataPathProvider : IAppDataPathProvider
{
    public string GetAppDataPath()
    {
        return MyHttpApplication.GetAppDataPath();
    }
}

MyHttpApplication.GetAppDataPathのようになります。

public class MyHttpApplication : HttpApplication
{
    // of course you can fetch&store the value at Application_Start
    public static string GetAppDataPath()
    {
        return HttpContext.Current.Server.MapPath("~/App_Data");
    }
}

[1] http://msdn.microsoft.com/en-us/library/ex526337%28v=vs.100%29.aspx

于 2012-10-23T11:05:16.893 に答える
6

Phil Haakには、クレイジーな "\"スタイルのディレクトリセパレータを使用してパスを処理する場合に、もう少し安定していると思う例があります。また、パスの連結も安全に処理します。System.IOでは無料で提供されます

var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);

ただし、「Server.MapPath」の代わりに「AppDomain.CurrentDomain.BaseDirector」を試すこともできます。

于 2010-11-16T20:49:49.143 に答える
5
string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");

また

string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");
于 2016-07-13T08:02:44.670 に答える
1

このようにして、ホスティングパスを取得しました。

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;

namespace IHostingEnvironmentExample.Controllers
{
    public class HomeController : Controller
    {
        private IHostingEnvironment _env;
        public HomeController(IHostingEnvironment env)
        {
            _env = env;
        }
        public IActionResult Index()
        {
            var webRoot = _env.WebRootPath;
            var file = System.IO.Path.Combine(webRoot, "test.txt");
            System.IO.File.WriteAllText(file, "Hello World!");
            return View();
        }
    }
}

https://forums.asp.net/t/1696005.aspx?How+to+get+Local+Server+path+in+mvc

于 2021-07-21T12:22:22.037 に答える