Microsoft Web API: Làm thế nào để bạn làm một Server.MapPath?


239

Microsoft Web API không phải là MVC , bạn không thể làm một cái gì đó như thế này:

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

cũng không phải cái này

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

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

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

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

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

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

Câu trả lời:


469

Bạn có thể sử dụng HostingEn Môi.MapPath trong bất kỳ bối cảnh nào mà System.Webcác đối tượng như HttpContext.Currentkhông có sẵn (ví dụ: cũng từ một phương thức tĩnh).

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

Xem thêm Sự khác biệt giữa Server.MapPath và HostingEn Môi.MapPath là gì?


1
Điều này thật tuyệt, nhưng không có cách nào dễ dàng để chế nhạo HostingEn Môi trường vì đây là một thể hiện của lớp tĩnh ... :-(
Josh G

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

1
@JoshG - bạn có thể trừu tượng HostingEn Môi.MapPath thông qua Func <chuỗi, chuỗi> GetWebPath = HostingEn Môi.MapPath và sau đó ghi đè GetWebPath tại thời điểm thử nghiệm bằng giả.
Sean B

có vẻ như điều này đang gặp rắc rối với những con đường tương đối như../images/
AaA

Nó đưa ra đường dẫn điều khiển, vậy tôi có thể lấy đường dẫn dịch vụ bằng cách sử dụng "HostingEn Môi trường" không?
Md Aslam

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

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

2

Bên cạnh những người vấp ngã trong vấn đề này, một cách hay để chạy cấp độ thử nghiệm khi sử dụng lệnh gọi HostingEn Môi trường, là nếu truy cập nói một chia sẻ UNC: \ example \ được ánh xạ tới ~ / example / bạn có thể thực hiện điều này để giải quyết 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 rằng hữu ích trong trường hợp bạn có quyền kiểm tra cục bộ trên một tệp, nhưng cần ánh xạ env một lần trong sản xuất.


Fyi, HostingEnvironmentlớp học trong System.Web.Hostingkhông gian tên.
Dermot

2
Sự thay thế HostingEnvironment cho lõi DNX 5.0 là gì?
roydukkey

Lớp Startup.cs mới bây giờ Tiêm một Startup công khai (IhostingEn Môi trường env) {} khi xây dựng, tài sản làm tôi suy nghĩ, chỉ cần làm điều này vào một ngày khác. cho phép bạn cũng kiểm soát một môi trường theo từng trường hợp và sử dụng các lệnh #if xây dựng một ứng dụng có thể dễ dàng triển khai nhiều tầng trong nhiều môi trường.
Nathan Teague

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.MapPathtrong WebApiHttpApplication; ví dụ như trong Application_Start().

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


0

Server.MapPath()không tồn tại trong Api Web (Xà phòng hoặc REST), bạn sẽ cần biểu thị địa phương - liên quan đến thư mục chính của ngữ cảnh của máy chủ web. Cách dễ nhất để làm như vậy là:

string AppContext.BaseDirectory { get;}

Sau đó, bạn có thể sử dụng điều này để nối một chuỗi đường dẫn để ánh xạ đường dẫn tương đối tới bất kỳ tệp nào.
LƯU Ý: đường dẫn chuỗi có \và không /giống như trong mvc.

Ví dụ:

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

trả về đúng - cho rằng đây là đường dẫn âm thanh trong ví dụ của bạn


-1

Câu trả lời được 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

1
Mặc dù có vẻ như đây là cách duy nhất bạn có thể nhận được đường dẫn đến ứng dụng WebAPI bạn, điều này mang đến cho bạn thư mục gốc của ứng dụng của bạn, nhưng không dịch đường dẫn tương đối như ~\folderhoặc ../images/để đường dẫn vật lý
AAA

-1

Bạn có thể thử như:

var path = "~ / Hình ảnh / test.png"; System.Web.Hosting.HostingEn Môi.MapPath (@ + path)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.