2010-08-23 19 views
10

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?

+1

"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

+0

@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

cevap

12

bunun nedeni yürütme yolunun belirli anlarında, HttpRuntime.AppDomainAppPath kullanmak en iyisidir, hiçbir HttpContext.Current yok.

Ayrıca bkz. this post.

+3

Neden HttpRuntime.AppDomainPath, AppDomain.BaseDirectory? ' – Matt

+4

'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

+0

Teşekkürler. AppDomainAppPath değil AppDomainPath (en azından .NET4) – Matt

4

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"); 
+0

Teşekkür ederiz nazlı – Matt

+2

Bir web sitesinde, doğru yolu döndürmesi garantilidir 'HttpRuntime.AppDomainPath' kullanmak tercih edilir. Ama driis haklı, bu yöntemlerin farklı bir şeyleri iade edebileceği çok az vaka düşünebilirim. – Abel

İlgili konular