Microsoft Web API: Bagaimana Anda melakukan Server.MapPath?

239

Karena Microsoft Web API bukan MVC , Anda tidak dapat melakukan sesuatu seperti ini:

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

atau ini

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

karena ini berada di bawah System.Webnamespace, bukan System.Web.Httpnamespace.

Jadi, bagaimana Anda mengetahui jalur server relatif di Web API ?
Saya biasa melakukan sesuatu seperti ini di MVC :

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

Yang akan memberi saya path absolut pada disk:

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

Jawaban:

470

Anda dapat menggunakan HostingEnvironment.MapPath dalam konteks apa pun di mana System.Webobjek seperti HttpContext.Currenttidak tersedia (misalnya juga dari metode statis).

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

Lihat juga Apa perbedaan antara Server.MapPath dan HostingEnvironment.MapPath?

StuartLC
sumber
1
Ini bagus, tetapi tidak ada cara mudah untuk mengejek HostingEnvironment karena ini adalah contoh kelas statis ... :-(
Josh G
6
Tentu, tetapi di controller atau lapisan logika lain yang ingin Anda uji, Anda hanya akan mengambil ketergantungan pada abstraksi Anda sendiri, seperti IPathMapper(Anda mungkin akan menggulung ini dengan sekelompok masalah lain ke dalam antarmuka toolbelt / utilitas yang lebih besar) dengan metodenya string MapPath(string virtualPath). Hanya implementasi konkret yang WebApi IPathMapperperlu Anda ketahuiSystem.Web.Hosting.HostingEnvironment
StuartLC
1
@JoshG - Anda dapat mengabstraksikan HostingEnvironment.MapPath melalui Func <string, string> GetWebPath = HostingEnvironment.MapPath dan kemudian menimpa GetWebPath pada saat pengujian dengan mock.
Sean B
Sepertinya ini mengalami masalah dengan jalur relatif seperti../images/
AaA
Ini memberikan jalur pengontrol, jadi bisakah saya mendapatkan jalur layanan dengan menggunakan "HostingEnvironment"?
Md Aslam
13
string root = HttpContext.Current.Server.MapPath("~/App_Data");
ArgeKumandan
sumber
16
Anda tidak ingin menggunakan HttpContext.Current di WebAPI. Bagaimana dengan API yang di-host-sendiri? Anda tidak dapat mengandalkan HttpContext.Current untuk berada di sana. Juga tidak ramah uji.
Trevor de Koekkoek
2

Sebagai tambahan bagi mereka yang tersandung di sepanjang ini, satu cara yang baik untuk menjalankan tingkat pengujian menggunakan panggilan HostingEnvironment, adalah jika mengakses katakanlah bagian UNC: \ example \ yang dipetakan ke ~ / example / Anda dapat menjalankan ini untuk berkeliling Masalah IIS-Ekspres:

#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

Saya menemukan bahwa membantu jika Anda memiliki hak untuk menguji secara lokal pada file, tetapi perlu pemetaan env sekali dalam produksi.

Nathan Teague
sumber
Fyi, HostingEnvironmentkelasnya ada di System.Web.Hostingnamespace.
Dermot
2
Apa alternatif HostingEnvironment untuk DNX core 5.0?
roydukkey
Kelas Startup.cs baru sekarang Menyuntikkan Startup publik (IHostingEnvironment env) {} pada konstruksi, properti menyelinap di pikiranku, baru saja melakukan ini di hari yang lain. yang memungkinkan Anda untuk juga mengontrol lingkungan per instance, dan menggunakan arahan #jika membangun aplikasi yang dapat dengan mudah melintasi tier di berbagai lingkungan.
Nathan Teague
1

Saya tidak bisa mengatakan dari konteks Anda pasokan, tetapi jika sesuatu itu Anda hanya perlu lakukan di aplikasi startup, Anda masih dapat menggunakan Server.MapPathdi WebApiHttpApplication; misalnya di Application_Start().

Saya hanya menjawab pertanyaan langsung Anda; yang sudah disebutkan HostingEnvironment.MapPath()mungkin merupakan solusi yang lebih disukai.

selotip
sumber
0

Karena Server.MapPath()tidak ada di dalam Web Api (Soap atau REST), Anda harus menunjukkan direktori lokal ke direktori home konteks server web. Cara termudah untuk melakukannya adalah dengan:

string AppContext.BaseDirectory { get;}

Anda kemudian dapat menggunakan ini untuk menggabungkan string path untuk memetakan path relatif ke file apa pun.
CATATAN: jalur string \dan tidak /seperti mereka berada di MVC.

Ex:

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

mengembalikan true-positing bahwa ini adalah jalur suara dalam contoh Anda

Tamu
sumber
-1

Jawaban yang dipilih tidak berfungsi di aplikasi API Web saya. Saya harus menggunakan

System.Web.HttpRuntime.AppDomainAppPath
Zoomzoom
sumber
1
Meskipun sepertinya ini adalah satu-satunya cara Anda bisa mendapatkan jalur ke aplikasi WebApi Anda, ini memberi Anda root aplikasi Anda tetapi tidak menerjemahkan jalur relatif seperti ~\folderatau ../images/ke jalur fisik
AaA
-1

Anda dapat mencoba seperti:

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

PASIR G.PATIL
sumber