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"

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?


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

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.


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.


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


-1

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

System.Web.HttpRuntime.AppDomainAppPath

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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.