Microsoft Web API: Nasıl Server.MapPath yapıyorsunuz?


239

Yana Microsoft Web API değil MVC , böyle bir şey yapamaz:

var a = Request.MapPath("~");

ne bu

var b = Server.MapPath("~");

çünkü bunlar System.Webisim alanının değil, System.Web.Httpisim alanının altında .

Peki Web API'sindeki göreli sunucu yolunu nasıl buluyorsunuz ? MVC'de
böyle bir şey yapardım :

var myFile = Request.MapPath("~/Content/pics/" + filename);

Bu da bana diskteki mutlak yolu verecektir:

"C:\inetpub\wwwroot\myWebFolder\Content\pics\mypic.jpg"

Yanıtlar:


470

Sen kullanabilirsiniz HostingEnvironment.MapPath herhangi bir bağlamda System.Webnesneler gibi HttpContext.Current(statik yönteminden de mesela) kullanılamaz.

var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");

Ayrıca bkz. Server.MapPath ve HostingEnvironment.MapPath arasındaki fark nedir?


1
Bu güzel, ama statik bir sınıf örneği olduğundan HostingEnvironment alay etmek kolay bir yolu yoktur ... :-(
Josh G

6
Elbette, ancak kontrol cihazınızda veya test etmek istediğiniz diğer mantık katmanında, sadece kendi soyutlamanıza bağımlı IPathMapperolacaksınız , örneğin (muhtemelen başka bir grup endişeyle daha büyük bir araç kemeri / yardımcı arayüz arayüzüne yuvarlayacaksınız) yöntem ile string MapPath(string virtualPath). Sadece WebApi IPathMapperbilmeniz gereken somut uygulamaSystem.Web.Hosting.HostingEnvironment
StuartLC

1
@JoshG - Func <string, string> GetWebPath = HostingEnvironment.MapPath aracılığıyla HostingEnvironment.MapPath'i soyutlayabilir ve daha sonra bir sahte ile test zamanında GetWebPath üzerine yazabilirsiniz.
Sean B

bunun gibi göreli yollar ile sorun ../images/
yaşıyor

Onun kontrolör yolu vererek, bu yüzden "HostingEnvironment" kullanarak hizmet yolu alabilir miyim?
Md Aslam

13
string root = HttpContext.Current.Server.MapPath("~/App_Data");

16
WebAPI'de HttpContext.Current kullanmak istemezsiniz. Kendi kendine barındırılan API'ler ne olacak? Orada olmak için HttpContext.Current güvenemezsiniz. Ayrıca test dostu değildir.
Trevor de Koekkoek

2

Bu sorunla karşılaşanların bir kenarı olarak, HostingEnvironment çağrısını kullanarak test seviyesini çalıştırmanın güzel bir yolu, erişmenin bir UNC paylaşımı: \ example \ ile eşlenen ~ / example / IIS-Express sorunları:

#if DEBUG
    var fs = new FileStream(@"\\example\file",FileMode.Open, FileAccess.Read);
#else
    var fs = new FileStream(HostingEnvironment.MapPath("~/example/file"), FileMode.Open, FileAccess.Read);
#endif

Bir dosyayı yerel olarak test etme hakkınız varsa, ancak env eşlemesinin bir kez üretimde olması gerektiğinde yararlı buluyorum.


Fyi, HostingEnvironmentsınıf System.Web.Hostingisim alanında.
Dermot

2
HostingEnvironment DNX core 5.0'a alternatif nedir ?
roydukkey

Yeni Startup.cs sınıfı şimdi halka açık bir Startup (IHostingEnvironment env) {} inşa ediyor. bu da her ortam için bir ortamı kontrol etmenizi sağlar ve #if yönergelerini kullanarak birden çok ortamda katman dağıtımını kolayca yapabilen bir uygulama oluşturun.
Nathan Teague

1

Sana arz bağlamdan söyleyemem, ama sadece uygulama başlangıçta yapmanız gereken 's şey, yine de kullanabilir Server.MapPathiçinde WebApiHttpApplication; örneğin Application_Start().

Sadece doğrudan sorunuza cevap veriyorum; daha önce bahsedilen HostingEnvironment.MapPath()muhtemelen tercih edilen çözümdür.


0

Yana Server.MapPath()bir Web Api (Sabun veya DİNLENME) içinde yok, web sunucusunun, duruma ana dizine yerel-göreceli belirtmek gerekir. Bunu yapmanın en kolay yolu:

string AppContext.BaseDirectory { get;}

Daha sonra, göreli yolu herhangi bir dosyaya eşlemek üzere bir yol dizesini birleştirmek için bunu kullanabilirsiniz.
Not: dize yolları, mvc gibi \değil /.

Ör:

System.IO.File.Exists($"{**AppContext.BaseDirectory**}\\\\Content\\\\pics\\\\{filename}");

bunun örneğinizde sağlam bir yol olduğunu söyleyerek true değerini döndürür


-1

Seçilen cevap Web API uygulamamda çalışmadı. Kullanmak zorundaydım

System.Web.HttpRuntime.AppDomainAppPath

1
Bu WebApi uygulamanızın yolunu almanın tek yolu gibi görünse de, bu size uygulamanızın kökünü verir, ancak fiziksel yollar gibi ~\folderveya ../images/fiziksel yollar gibi göreceli yolları
çevirmez

-1

Şunu deneyebilirsiniz:

var path = "~ / Image / test.png"; System.Web.Hosting.HostingEnvironment.MapPath (@ + yolu)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.