2009-06-01 11 views
109

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.Tôi có thể sử dụng Server.MapPath() từ global.asax như thế nào?

Tuy nhiên, kể từ Server.MapPath() dựa trên 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, mặc dù phương thức "có sẵn", tôi nhận được ngoại lệ sau:

Thao tác 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ạ thư mục tương đối gốc của web chẳng hạn như ~/App_Data/ đến đường dẫn vật lý đầy đủ chẳng hạn như C:\inetpub\wwwroot\project\App_data\?

Trả lời

266

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

Không HttpContext bắt buộc.

+0

Bất kỳ cảnh báo nào đối với kỹ thuật này? –

+9

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

+1

+1 điều này cố định một dự án mã nguồn mở đã được làm việc cho tôi sau đó chỉ dừng lại khởi tạo do HttpContext.Current.Server thổi lên cho nó không có một bối cảnh vì một lý do nào đó. Chuyển sang điều này đặt nó trở lại thuyền buồm trơn tru. –

-3

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

+2

Bạn có thể tham khảo nó như thế trong các lớp thực sự CÓ một HttpContext, nhưng tôi không nghĩ global.asax có một, do đó thông báo lỗi tôi nhận được. –

1

Khi trong Global.asax, sử dụng bối cảnh đối tượng:

context.Server.mappath()

Bối cảnh cho phép bạn cũng truy cập vào bộ sưu tập phiên, đối tượng yêu cầu, đối tượng phản ứng . Rất hữu ích khi bạn muốn ghi lại lỗi, ví dụ:

+0

Không có đảm bảo 'Ngữ cảnh' trong Global.asax. –

3

Sử dụng AppDomain.CurrentDomain.BaseDirectoryContext có thể trả về giá trị rỗng !!