2013-05-15 31 views
184

Kể từ Microsoft Web API không là MVC, bạn không thể làm một cái gì đó như thế này:Microsoft Web API: Bạn làm thế nào để thực hiện một Server.MapPath?

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

cũng không này

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

bởi vì đây là dưới namespace System.Web, không phải là không gian tên System.Web.Http .

Vậy làm cách nào để bạn tìm ra đường dẫn máy chủ tương đối trong API Web?
tôi sử dụng để làm một cái gì đó như thế này trong MVC:

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

Trong đó sẽ cho tôi đường dẫn tuyệt đối trên đĩa:

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

Trả lời

365

Bạn có thể sử dụng HostingEnvironment.MapPath trong bất kỳ bối cảnh nơi System.Web đối tượng như HttpContext.Current là không có sẵn (ví dụ: từ phương pháp tĩnh).

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

Xem thêm What is the difference between Server.MapPath and HostingEnvironment.MapPath?

+0

này là tốt đẹp, nhưng không có cách nào dễ dàng để thử HostingEnvironment vì nó là một ví dụ lớp tĩnh ... :-( –

+5

Chắc chắn, nhưng trong điều khiển của bạn hoặc lớp logic khác mà bạn muốn thử nghiệm, bạn sẽ chỉ phụ thuộc vào sự trừu tượng của riêng bạn, như 'IPathMapper' (bạn có thể sẽ cuộn lên với một loạt các mối quan tâm khác vào một giao diện công cụ/tiện ích lớn hơn) với phương thức' string MapPath (string virtualPath) ' Chỉ việc triển khai thực hiện cụ thể cho 'WebApi IPathMapper' của bạn cần biết về' System.Web.Hosting.HostingEnvironment' – StuartLC

+1

@JoshG - bạn có thể trừu tượng HostingEnvironment.MapPath thông qua Func GetWebPath = HostingEnvironment.MapPath và sau đó ghi đè lên GetWebPath tại thời điểm thử nghiệm với mô hình. –

1

Tôi không thể nói từ bối cảnh mà bạn cung cấp, nhưng nếu đó là một cái gì đó bạn chỉ cần làm lúc khởi động ứng dụng, bạn vẫn có thể sử dụng Server.MapPath trong WebApiHttpApplication; ví dụ. trong Application_Start().

Tôi chỉ trả lời câu hỏi trực tiếp của bạn; đã đề cập đến HostingEnvironment.MapPath() có lẽ là giải pháp ưu tiên.

9
string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
+10

Bạn không muốn sử dụng HttpContext.Current trong WebAPI. Còn API tự lưu trữ thì sao? Bạn không thể dựa vào HttpContext.Current để được ở đó. Ngoài ra nó không phải là thử nghiệm thân thiện. –

+0

@TrevordeKoekkoek u r right :) – ArgeKumandan

+0

Không hoạt động trong DNN 7.x –

1

Là một sang một bên để những người vấp ngã cùng trên này, một trong những cách tốt đẹp để chạy mức độ kiểm tra về việc sử dụng các cuộc gọi HostingEnvironment, là nếu truy cập vào nói một chia sẻ UNC: \ ví dụ \ được ánh xạ tới ~/example/bạn có thể thực hiện điều này để khắc phục các sự cố 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 

Tôi thấy hữu ích trong trường hợp bạn có quyền kiểm tra cục bộ trên tệp nhưng cần bản đồ env một lần trong quá trình sản xuất.

+0

Fyi, lớp 'HostingEnvironment' nằm trong không gian tên' System.Web.Hosting'. – Dermot

+2

Giải pháp thay thế cho 'HostingEnvironment' cho lõi DNX 5.0 là gì? – roydukkey

+0

Lớp Startup.cs mới hiện đang tiêm một Khởi động công cộng (IHostingEnvironment env) {} về xây dựng, tài sản trượt tâm trí của tôi, chỉ cần làm điều này vào ngày khác. cho phép bạn cũng kiểm soát môi trường trên mỗi trường hợp và sử dụng #if chỉ thị để xây dựng một ứng dụng có thể dễ dàng triển khai tầng trong nhiều môi trường. –

-1

Câu trả lời đã chọn không hoạt động trong ứng dụng API Web của tôi. Tôi đã phải sử dụng

System.Web.HttpRuntime.AppDomainAppPath 
+0

Downvoter, quan tâm giải thích? – Zoomzoom

Các vấn đề liên quan