2008-09-20 864 views
7

Tôi đang làm việc với trình lập lịch biểu của DotNetNuke để lên lịch các tác vụ và tôi đang tìm cách lấy đường dẫn tệp vật lý của mẫu email mà tôi đã tạo. Vấn đề là HttpContext là NULL vì nhiệm vụ theo lịch trình là trên một chủ đề khác nhau và không có yêu cầu http. Làm thế nào bạn sẽ đi về nhận được đường dẫn vật lý của tập tin?Trong ASP.NET làm thế nào bạn nhận được đường dẫn tập tin vật lý khi HttpContext.Current là NULL?

Trả lời

13

System.Web.Hosting.HostingEnvironment.MapPath là những gì bạn đang tìm kiếm. Bất cứ khi nào bạn đang sử dụng các đối tượng Máy chủ hoặc HttpContext.Current, hãy kiểm tra trước để xem nếu HostingEnvironment có những gì bạn cần.

+0

nếu bạn ở bên ngoài dự án web nhưng muốn cho phép nói đến thư mục hình ảnh của dự án web của bạn để lấy hình ảnh hoặc đọc cho phép nói nội dung của tệp .htm là trang web trong trang web của bạn nhưng bạn có phương thức tiện ích bạn muốn gọi bên ngoài để tải tệp đó? – PositiveGuy

+0

Nếu bạn đang ở bên ngoài dự án web, tôi sẽ nghĩ rằng bạn sẽ cần mã tùy chỉnh của riêng bạn để định vị dự án web. Một khi bạn đã có điều đó, bạn chỉ có thể tiếp tục theo con đường đó mà không có bất kỳ helper đặc biệt như 'MapPath'. – bdukes

0

Vì quá trình này thực sự nằm ngoài phạm vi liên quan đến trang web, có thể bạn chỉ cần đặt đường dẫn trong tệp cấu hình.

Có thể không phải là ý tưởng hay nhất, nhưng đó là một giải pháp thay thế.

0

điều gì nói this.GetType(). Assembly.Location?

+1

Nó trả về c: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Tệp ASP.NET tạm thời \ mywebsite \ 50f1a686 \ ab5b581d \ App_Code.xkcsxvg6.dll – John

0

Bạn có thể nhìn vào hội & các đường dẫn codebase như thế này:

Imports System.Reflection 
Imports System.IO 
... 
Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) 

Đó loại công cụ không luôn luôn làm việc, vì vậy những gì tôi muốn giới thiệu làm đang viết một bản ghi với một loạt các dữ liệu về lắp ráp, để xem những gì hoạt động ở vị trí này. Đó là những gì tôi phải làm để có được một cái gì đó tương tự khi tôi đã tạo ra một thành phần COM được lưu trữ trong AppCenter. Tôi sử dụng này để "có được" những gì "APP_BASE" nên được, và thiết lập đó, do đó, các tập tin app.config sẽ tải đúng cách.

Log.Write (Assembly.GetExecutingAssembly().CodeBase) 
Log.Write (Assembly.GetExecutingAssembly().Location) 
Log.Write (Path.GetFullPath(".")) 
Log.Write (Application.StartupPath) 
... and so on, whatever you can think of ... 
1

Có rất nhiều cách để làm điều này, cá nhân tôi có được nó bằng cách lưu trữ thông tin đường dẫn như một tùy chọn cấu hình cho mô-đun của tôi, nó không phải là thanh lịch, nhưng nó hoạt động và hoạt động mọi lúc.

Joe Brinkman Tôi tin tưởng một nơi nào đó xung quanh có một bài đăng trên blog về cách xây dựng một HTTPContext mới để sử dụng bên trong lịch trình.

+0

Đối với người đọc trong tương lai, các bài viết của Joe Brinkman là [ở đây, cho phiên bản gốc] (http://www.dnnsoftware.com/community-blog/cid/135304/the-quest-for-the-dotnetnuke-holy-grail) và [ở đây cho một phiên bản cập nhật] (http://www.dnnsoftware.com/community-blog/cid/137009/new-and-improved-holy-grail). – AaronSieb