2010-09-10 16 views
6

Chúng ta có thể phụ thuộc vào thư mục làm việc hiện tại trong mã ASP.NET không? Hay nói cách khác, chúng ta có thể sử dụng các đường dẫn tương đối không, và chắc chắn rằng chúng sẽ hoạt động?Thư mục làm việc hiện tại trong ASP.NET code-behinds - chúng ta có thể phụ thuộc vào nó?

Nếu, trong một trang trên một trang web, tôi đặt thư mục làm việc hiện tại cho một mục cụ thể, nó sẽ vẫn giống như lần sau khi một trang khác trên trang web được tải? Khi cùng một trang trên trang web được tải?

Nếu tôi đặt thư mục làm việc hiện tại thành một cái gì đó cụ thể, trong Page_Load(), tôi có thể chắc chắn rằng nó sẽ vẫn giống với thời gian Page_PreRender() được gọi không? Hoặc có thể một trang khác trên cùng một trang web thay đổi nó trên tôi, ở giữa? Có thể một trang trên một trang web khác trong cùng một hồ bơi ứng dụng thay đổi nó trên tôi không? Một trang trong một trang web khác trong một nhóm ứng dụng khác nhau?

Nói cách khác, phạm vi của thư mục làm việc hiện tại, trong IIS là gì? Có cụ thể cho một trang không? Là nó cụ thể cho một trang web? Hay là nó được chia sẻ giữa tất cả các trang trong một nhóm ứng dụng?

Ở đâu, giữa trang, trang web, hồ bơi ứng dụng và máy chủ, là các ranh giới tách biệt các giá trị khác nhau của thư mục làm việc hiện tại?

+1

Tại sao bạn muốn tận dụng thư mục làm việc hiện tại trên máy chủ web? Tôi không hiểu nó có ý nghĩa gì. Thư mục làm việc là thư mục được sử dụng khi khởi chạy w3wp.exe - nó có liên quan như thế nào? –

+0

Từ mã sau, chúng tôi đang truy cập một hội đồng .NET được viết để cung cấp chức năng chia sẻ giữa các ứng dụng web và máy tính để bàn. Người dùng có thể gửi công việc qua ứng dụng dành cho máy tính để bàn hoặc người dùng có thể gửi công việc qua trang web. Trong cả hai trường hợp, việc xử lý công việc được xử lý bởi hội đồng .NET, và nó kết thúc bằng cách viết một tệp vào một trong nhiều thư mục hàng đợi, được truy cập thông qua các đường dẫn tương đối. Câu hỏi đặt ra là liệu chúng ta có cần phải viết lại tất cả các tập tin xử lý trong assembly để làm cho nó hoạt động đáng tin cậy với IIS. –

+0

Bạn không cần phải viết lại bất cứ điều gì. – IrishChieftain

Trả lời

5

Environment.CurrentDirectory là một wrapper đơn giản xung quanh các chức năng GetCurrentDirectorySetCurrentDirectory WINAPI. Thật vậy, cố gắng thiết lập thư mục yêu cầu quyền UnmanagedCode. Bất cứ khi nào một chức năng ngăn trang web của bạn chạy trong tin cậy một phần, bạn có quyền cảnh giác tùy thuộc vào nó. :)

Từ các tài liệu SetCurrentDirectory:

Thay đổi thư mục hiện hành cho quá trình hiện.

Giải thích tốt nhất tôi có thể tìm thấy bao gồm mối quan hệ giữa quy trình w3wp.exe và trang ASP.NET là this answer. Bất kỳ trang nào khác trong trang web của bạn có thể có khả năng thay đổi thư mục làm việc hiện tại của trang của bạn. Bất kỳ trang nào trên bất kỳ trang web nào khác trong cùng một hồ bơi ứng dụng đều có khả năng thay đổi thư mục làm việc hiện tại của trang của bạn. Những thay đổi bên ngoài vào thư mục làm việc hiện tại có thể xảy ra bất cứ lúc nào trong quá trình thực thi trang của bạn. Mặt khác, một trang trên một trang web trong một nhóm ứng dụng khác sẽ không thay đổi thư mục làm việc hiện tại của trang của bạn. Lý do tôi nói "có khả năng" là nó thậm chí còn phức tạp hơn nếu bạn xem xét các kịch bản web vườn, nơi có thể có nhiều hơn một quá trình cho một trang ASP.NET duy nhất.

Bây giờ xem xét rằng SetCurrentDirectory không phải là thread an toàn:

các ứng dụng đa luồng và chia sẻ thư viện mã không nên sử dụng chức năng SetCurrentDirectory và nên tránh sử dụng đường dẫn tương đối tên. Trạng thái thư mục hiện được viết bởi các SetCurrentDirectory chức năng được lưu giữ như một biến toàn cầu trong mỗi quá trình, do đó ứng dụng đa luồng có thể không đáng tin cậy sử dụng giá trị này mà không tham nhũng có thể dữ liệu từ đề khác mà cũng có thể được đọc hoặc thiết lập này giá trị. Giới hạn này cũng áp dụng cho các chức năng GetCurrentDirectory và GetFullPathName. Các ngoại lệ là khi ứng dụng đảm bảo sẽ được chạy trong một chủ đề duy nhất , ví dụ phân tích tên tập tin từ các chuỗi đối số dòng lệnh trong thread chính trước khi tạo bất kỳ thêm đề. Sử dụng tên đường dẫn tương đối trong ứng dụng đa luồng hoặc được chia sẻ mã thư viện có thể mang lại kết quả không thể đoán trước và không được hỗ trợ.

Cơ hội là bạn không muốn phụ thuộc vào thư mục làm việc hiện tại. Có nói rằng, cho rằng nó ngu ngốc như thế nào là dựa vào thư mục làm việc hiện tại, bạn có thể chắc chắn một cách hợp lý rằng không có mã nào khác sẽ chạm vào nó. :) Xem nhanh với Reflector cho thấy rằng không có mã .NET framework nào thay đổi nó. Một vài chức năng kiểm tra nó mặc dù, vì vậy xem ra cho những người. Nếu bạn kiểm soát môi trường triển khai, bạn có thể đảm bảo rằng trang web của bạn chạy trong nhóm ứng dụng riêng của nó. Với kỹ thuật đồng bộ hóa phù hợp, bạn có thể an toàn cập nhật thư mục làm việc hiện tại. Tôi sẽ không xem xét nó bất cứ điều gì khác hơn là một hack mặc dù.

0

Liên kết nên được tạo ra liên quan đến gốc trang web bằng cách sử dụng dấu ngã (~) điều hành:

<a href="~/mysite/somepage.aspx" id="someLink" runat="server">Some Page</a> 

Trong vòng một máy chủ, bể bơi ứng dụng hoàn toàn cô lập trang web của bạn để nếu một số trang web khác bị treo trên cùng một máy chủ , nó sẽ không làm giảm trang web của bạn với nó. IIS là khá nhiều trang web cụ thể với các lợi ích cô lập thêm của hồ bơi ứng dụng. Tôi có thể thấy không có sử dụng thực tế trong cố gắng để thay đổi một liên kết trên một trang từ mã phía sau trong khác (hoặc có lẽ tôi không hoàn toàn hiểu được câu hỏi).

Dưới đây là một bản tóm tắt các kiến ​​trúc IIS:

http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis-7/

+1

Tôi không nói về liên kết, tôi đang nói về hệ thống tệp. –

+0

Bạn đã hỏi rõ về đường dẫn tương đối. Tôi nghĩ bạn cần phải thuật lại câu hỏi. – IrishChieftain

8

AppDomain.CurrentDomain.RelativeSearchPath sẽ cung cấp cho bạn đường dẫn vật lý vào thư mục bin

+0

hoàn hảo- cảm ơn –

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