Bir ASP.NET MVC web uygulamasında HttpContext olmadan çalışan bazı işlemler var. Bu işlem, veri okuma/yazma için uygulamanın İçindekiler dizinine fiziksel yolu belirleyebilmelidir. Ancak, bir HttpContext olmadan olduğu için Server.MapPath ve benzeri gibi süslü şeyler kullanamıyorum. Öneriler?HttpContext olmadan bir dosyanın fiziksel yolunu nasıl belirlersiniz?
cevap
bunun nedeni yürütme yolunun belirli anlarında, HttpRuntime.AppDomainAppPath
kullanmak en iyisidir, hiçbir HttpContext.Current
yok.
Ayrıca bkz. this post.
Neden HttpRuntime.AppDomainPath, AppDomain.BaseDirectory? ' – Matt
'dan daha iyi anlamlıdır. HttpRuntime içinde olduğunuzda, çalışma zamanını kendinize dolamak yerine doğru yolu sormak daha iyidir. Ayrıca, kodunuzu daha okunabilir hale getirir ve daha net düşünür. Son olarak, uygulamalar değişebilir, ancak bu durumda bile, HttpRuntime yine de doğru yolu döndürür ve AppDomain olmaz (aynı AppDomain'i başlattığınız nadir durumlar için de geçerli olabilir). – Abel
Teşekkürler. AppDomainAppPath değil AppDomainPath (en azından .NET4) – Matt
Bunu yapmanın en iyi yolu, AppDomain.BaseDirectory
özelliğini kullanmaktır. Özel uygulama alanlarıyla çalışmadığınız sürece, kök uygulama dizininize işaret eder. Diğer bir deyişle; Bu iki dize aynı olacaktır: (site başladığında yani) bir web sitesinde
string mapUsingAppDomain = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Contents");
string mapUsingServer = HttpContext.Current.Server.MapPath("~/Contents");
"HttpContext.Current" null bile olsa, Server.MapPath 'hala çalışır. Eğer "sahibi" yoksa, belki de "System.Web" referansını kaçırdığınızı mı kastediyorsunuz? – Abel
@Abel: "Sunucu", örneğin, "Sunucu", HttpContext.Current (ve ayrıca bir HttpApplication özelliği) özelliğidir, çünkü, bir statik yapıcı içinde .MapPath kullanmak için "Sunucu" için bir başvuru "sahip" olmaz. Bu tür statik bir ortamda güvenilir bir şekilde mevcut olacaktır. "Sunucu", yapıcısı dahili olan "HttpServerUtility" türündendir; bu nedenle, HttpContext.Current veya Global.asax'ta HttpApplication'dan elde edemediğiniz sürece bunu kullanamazsınız. Bu nedenle, HttpRuntime.AppDomainAppPath, aşağıdaki cevabınızda gönderdiğiniz şekilde kullanılmalıdır. – Triynko