ฉันจะใช้ Server.MapPath () จาก global.asax ได้อย่างไร


122

ฉันจำเป็นต้องใช้Server.MapPath()เพื่อรวมพา ธ ไฟล์บางไฟล์ที่ฉันเก็บไว้ในไฟล์web.config.

อย่างไรก็ตามเนื่องจากServer.MapPath()อาศัย HttpContext ปัจจุบัน (ฉันคิดว่า) ฉันไม่สามารถทำสิ่งนี้ได้ เมื่อพยายามใช้วิธีนี้แม้ว่าจะ "ใช้ได้" ฉันก็ได้รับข้อยกเว้นดังต่อไปนี้:

การทำงานของเซิร์ฟเวอร์ไม่พร้อมใช้งานในบริบทนี้

มีวิธีอื่นที่สามารถแม็พไดเร็กทอรีสัมพัทธ์รูทของเว็บเช่น~/App_Data/กับเส้นทางฟิสิคัลแบบเต็มเช่นC:\inetpub\wwwroot\project\App_data\?

คำตอบ:


295

คุณอาจจะลองSystem.Web.Hosting.HostingEnvironment.MapPath ()

ไม่จำเป็นต้องมี HttpContext


มีข้อแม้สำหรับเทคนิคนี้หรือไม่?
John Bubriski

10
Nope หากคุณยิงตัวสะท้อนแสงคุณจะสังเกตเห็นว่าในที่สุด Server.MapPath และ Request.MapPath จะเรียก VirtualPath.MapPath ซึ่งท้ายที่สุดเรียกว่า HostingEnvironment.MapPath พวกเขาทั้งหมดลงเอยที่เดียวกัน HostingEnvironment.MapPath ตัดชายกลางคนออก
Corbin

1
+1 สิ่งนี้แก้ไขโครงการโอเพ่นซอร์สที่ใช้งานได้สำหรับฉันจากนั้นก็หยุดการเริ่มต้นเนื่องจาก HttpContext.Current.Server ไม่ได้มีบริบทด้วยเหตุผลบางประการ การเปลี่ยนไปใช้วิธีนี้จะทำให้การเดินเรือราบรื่น
Chris Marisic


1

เมื่ออยู่ใน Global.asax ให้ใช้วัตถุบริบท :

context.Server.mappath ()

บริบทช่วยให้คุณสามารถเข้าถึงคอลเลกชันเซสชันวัตถุร้องขอวัตถุตอบสนอง มีประโยชน์มากเมื่อคุณต้องการบันทึกข้อผิดพลาดเช่น


ไม่มีการรับประกันContextใน Global.asax
Anders Tornblad

-3

คุณสามารถลองใช้ HttpContext.Current.Server.MapPath ("/") - นั่นคือสิ่งที่ฉันได้อ้างอิงมาก่อนในชั้นเรียน


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