Làm cách nào để sử dụng Server.MapPath () từ global.asax?


122

Tôi cần sử dụng Server.MapPath()để kết hợp một số đường dẫn tệp mà tôi lưu trữ trong web.config.

Tuy nhiên, vì Server.MapPath()dựa vào HttpContext hiện tại (tôi nghĩ), tôi không thể thực hiện việc này. Khi cố gắng sử dụng phương pháp này, mặc dù phương pháp "có sẵn", tôi nhận được ngoại lệ sau:

Hoạt động máy chủ không khả dụng trong ngữ cảnh này.

Có phương pháp nào khác có thể ánh xạ một thư mục tương đối gốc web chẳng hạn như ~/App_Data/đường dẫn vật lý đầy đủ chẳng hạn như C:\inetpub\wwwroot\project\App_data\?

Câu trả lời:


295

Bạn có thể thử System.Web.Hosting.HostingEnosystem.MapPath () .

Không cần HttpContext.


Bất kỳ lưu ý nào đối với kỹ thuật này?
John Bubriski

10
Không. Nếu bạn kích hoạt Reflector, bạn sẽ nhận thấy rằng Server.MapPath và Request.MapPath cuối cùng gọi VirtualPath.MapPath mà cuối cùng gọi HostingEnosystem.MapPath. Tất cả chúng đều kết thúc ở cùng một nơi. HostingEnosystem.MapPath cắt đứt người trung gian.
Corbin tháng 3 ngày 3 tháng

1
+1 điều này đã sửa một dự án nguồn mở đang hoạt động cho tôi sau đó chỉ ngừng khởi tạo do HttpContext.Current.Server bị nổ vì nó không có ngữ cảnh vì một số lý do. Chuyển sang cái này sẽ giúp nó trở lại thuận buồm xuôi gió.
Chris Marisic

4

Sử dụng AppDomain.CurrentDomain.BaseDirectoryContextcó thể trả về null !!


1

Khi ở trong Global.asax, hãy sử dụng đối tượng ngữ cảnh :

context.Server.mappath ()

Ngữ cảnh cho phép bạn truy cập cả tập hợp phiên, đối tượng yêu cầu, đối tượng phản hồi. Rất hữu ích khi bạn muốn ghi lại các lỗi chẳng hạn


Không có gì đảm bảo Contexttrong Global.asax.
Anders Tornblad

-3

Bạn có thể thử HttpContext.Current.Server.MapPath ("/") - Đó là cách tôi đã tham chiếu nó trước đây trong các lớp.


2
Bạn có thể tham chiếu nó như vậy trong các lớp thực sự CÓ HttpContext, nhưng tôi không nghĩ rằng global.asax có một, do đó tôi nhận được thông báo lỗi.
John Bubriski
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.