[.net] ASP.NET MVC-컨트롤러에서 App_Data 폴더의 절대 경로 찾기

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();
    }

}

웹 컨텍스트 VirtualPathUtility.ToAbsolute () 외부에서는 작동하지 않는다고 생각합니다. 문자열 경로는 “C : \ App_Data \ somedata.xml”로 다시 나타납니다.

MVC 앱에서 .xml 파일의 경로를 어디에서 결정해야합니까? global.asax를 응용 프로그램 수준 변수로 사용합니까?



답변

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 메서드


답변

string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();

이것은 아마도 “올바른”방법입니다.


답변

WCF 서비스의 맥락에서도 작동하기 때문에 HostingEnvironment대신 사용 습관을 얻으려고합니다 Server.

 HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");


답변

가장 올바른 방법은을 사용하는 것 HttpContext.Current.Server.MapPath("~/App_Data");입니다. 즉, HttpContext가 사용 가능한 메소드에서만 경로를 검색 할 수 있습니다. App_Data 디렉토리는 웹 프로젝트 폴더 구조입니다 [1].

액세스 할 수없는 클래스에서 ~ / App_Data에 대한 경로가 필요한 경우 HttpContextIoC 컨테이너를 사용하여 항상 공급자 인터페이스를 주입 할 수 있습니다.

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


답변

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”를 시도 할 수도 있습니다.


답변

string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");

또는

string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");


답변

string Index = i;
            string FileName = "Mutton" + Index + ".xml";
            XmlDocument xmlDoc = new XmlDocument();

            var path = Path.Combine(Server.MapPath("~/Content/FilesXML"), FileName);
            xmlDoc.Load(path); // Can use xmlDoc.LoadXml(YourString);

이것이 현재 필요한 경로를 얻는 가장 좋은 해결책입니다.