Microsoft Web API: คุณจะทำ Server.MapPath ได้อย่างไร


239

เนื่องจากMicrosoft Web APIไม่ใช่MVCคุณจึงไม่สามารถทำสิ่งนี้ได้:

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

หรือสิ่งนี้

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

เนื่องจากสิ่งเหล่านี้อยู่ภายใต้System.Webเนมสเปซไม่ใช่System.Web.Httpเนมสเปซ

ดังนั้นคุณจะหาเส้นทางเซิร์ฟเวอร์สัมพัทธ์ในWeb API ได้อย่างไร
ฉันเคยทำสิ่งนี้ในMVC :

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

ซึ่งจะให้เส้นทางที่แน่นอนบนดิสก์:

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

คำตอบ:


470

คุณสามารถใช้HostingEnvironment.MapPathในบริบทใด ๆ ที่System.Webวัตถุเช่นHttpContext.Currentไม่พร้อมใช้งาน (เช่นจากวิธีคงที่)

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

ดูเพิ่มเติมความแตกต่างระหว่าง Server.MapPath และ HostingEnvironment.MapPath คืออะไร


1
นี่เป็นสิ่งที่ดี แต่ไม่มีวิธีง่ายๆในการเยาะเย้ย HostingEnvironment เนื่องจากเป็นคลาสแบบสแตติก ... :-(
Josh G

6
แน่นอน แต่ในคอนโทรลเลอร์ของคุณหรือเลเยอร์ตรรกะอื่น ๆ ที่คุณต้องการทดสอบคุณจะต้องอาศัยเพียงนามธรรมของคุณเองเช่นIPathMapper(คุณอาจม้วนสิ่งนี้ด้วยความกังวลอื่น ๆ เป็นส่วนใหญ่ toolbelt / ยูทิลิตี้อินเทอร์เฟซ) string MapPath(string virtualPath)ด้วยวิธีการที่ มีเพียงการดำเนินการอย่างเป็นรูปธรรมสำหรับWebApi IPathMapperความต้องการของคุณที่จะรู้System.Web.Hosting.HostingEnvironment
StuartLC

1
@JoshG - คุณสามารถนามธรรม HostingEnvironment.MapPath ผ่าน Func <string, string> GetWebPath = HostingEnvironment.MapPath แล้วเขียนทับ GetWebPath ในเวลาทดสอบด้วยการจำลอง
Sean B

ดูเหมือนว่านี่จะมีปัญหากับเส้นทางที่เกี่ยวข้องเช่น../images/
AaA

มันให้เส้นทางตัวควบคุมดังนั้นฉันจะได้รับเส้นทางบริการโดยใช้ "HostingEnvironment"
Md Aslam

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

16
คุณไม่ต้องการใช้ HttpContext.Current ใน WebAPI API แบบโฮสต์ด้วยตนเองคืออะไร คุณไม่สามารถพึ่งพา HttpContext.Current ได้ นอกจากนี้ยังไม่ได้ทดสอบความเป็นมิตร
Trevor de Koekkoek

2

นอกเหนือไปจากผู้ที่สะดุดไปด้วยวิธีนี้เป็นวิธีที่ดีวิธีหนึ่งในการรันระดับการทดสอบการใช้การเรียก HostingEnvironment คือถ้าเข้าถึงการพูดว่าแบ่งปัน UNC: \ example \ ที่แมปกับ ~ / example / คุณสามารถดำเนินการนี้เพื่อรับรอบ ปัญหาของ IIS-Express:

#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

ฉันพบว่ามีประโยชน์ในกรณีที่คุณมีสิทธิ์ในการทดสอบไฟล์ แต่ต้องใช้การแม็พ env เมื่อใช้งานจริง


Fyi HostingEnvironmentคลาสอยู่ในSystem.Web.Hostingเนมสเปซ
Dermot

2
ทางเลือกอื่นHostingEnvironment สำหรับ DNX core 5.0 คืออะไร
roydukkey

คลาส Startup.cs ใหม่ในขณะนี้เป็นการเริ่มต้นสาธารณะ (IHostingEnvironment env) {} ในการก่อสร้างสถานที่ให้บริการจิตใจของฉันลื่นเพียงแค่นี้ในวันอื่น ๆ ที่ช่วยให้คุณสามารถควบคุมสภาพแวดล้อมต่ออินสแตนซ์และการใช้คำสั่ง #if สร้างแอปที่สามารถปรับใช้ระดับข้ามได้อย่างง่ายดายในหลายสภาพแวดล้อม
Nathan Teague

1

ฉันไม่สามารถบอกได้จากบริบทที่คุณให้ แต่ถ้ามันเป็นสิ่งที่คุณเพียงแค่ต้องทำเมื่อเริ่มต้นแอปคุณยังสามารถใช้Server.MapPathในWebApiHttpApplication; Application_Start()เช่นใน

ฉันแค่ตอบคำถามโดยตรงของคุณ ที่กล่าวถึงแล้วHostingEnvironment.MapPath()น่าจะเป็นทางออกที่ต้องการ


0

เนื่องจากServer.MapPath()ไม่มีอยู่ใน Web Api (Soap หรือ REST) ​​คุณจะต้องแสดงถึงโลคอลที่สัมพันธ์กับไดเรกทอรีบริบทของเว็บเซิร์ฟเวอร์ วิธีที่ง่ายที่สุดคือ:

string AppContext.BaseDirectory { get;}

จากนั้นคุณสามารถใช้สิ่งนี้เพื่อเชื่อมสตริงสตริงเพื่อแมปพา ธ สัมพัทธ์กับไฟล์
หมายเหตุ: เส้นทางสตริงเป็น\และไม่/เหมือนพวกเขาอยู่ใน mvc

Ex:

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

คืนค่าจริงซึ่งเป็นเส้นทางเสียงในตัวอย่างของคุณ


-1

คำตอบที่เลือกไม่ทำงานในแอปพลิเคชัน Web API ของฉัน ฉันต้องใช้

System.Web.HttpRuntime.AppDomainAppPath

1
แม้ว่าดูเหมือนว่านี่เป็นวิธีเดียวที่คุณจะได้รับเส้นทางไปยังแอป WebApi ของคุณ แต่จะให้รูทแอปพลิเคชันของคุณ แต่ไม่ได้แปลเส้นทางที่เกี่ยวข้องเช่น~\folderหรือ../images/เส้นทางที่มีอยู่จริง
AaA

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.