2013-08-05 35 views
6

Tôi đang phát triển một ứng dụng ASP.NET 4 và sử dụng đầy đủ IIS cũng trong quá trình phát triển (vì nhiều lý do; một trong đó tôi sử dụng nhiều tên miền trỏ đến ứng dụng).Trì hoãn AppDomain tái chế trên thư mục thay đổi

Khi tôi xây dựng dự án trong Visual Studio IIS, hãy tái chế AppDomain và tải tệp mới được tạo, nhưng bây giờ tôi gặp sự cố, nó thực hiện việc này "nhanh".
Tôi có một số tập lệnh trên trang của tôi kích hoạt App-Startup ngay sau khi được tái chế (như các kênh SignalR mở liên tục) và do đó AppDomain mới đã được tạo khi chỉ một nửa dự án của tôi được tạo và do đó nó tái chế một giây thời gian mà sau đó thực sự bị treo, bởi vì tôi có một PreApplicationStartMethod sao chép một số Plugin-DLL vào thư mục Shadow-Copy, nhưng "DLL cũ" vẫn bị khóa bởi AppDomain đầu tiên.
Nếu tôi đợi ~ 10 giây mọi thứ đều ổn và "AppDomain mới" của tôi sẽ khởi động.
Tôi mặc dù giải quyết vấn đề này bằng cách chỉ cần nói với IIS để chờ đợi với rececly cho một vài giây để xây dựng có thể hoàn thành sau khi nó phát hiện những thay đổi trong thư mục bin.

Vì vậy, với câu hỏi chính của tôi:
Có thể trì hoãn tái chế AppDomain trong IIS không?

+1

Nếu đó chỉ là vấn đề về khóa, bạn có cố gắng 'Vô hiệu hóa tái chế chồng chéo' để tránh hai quá trình nhân viên đồng thời không? – JoeBilly

Trả lời

14

Nếu bạn không thể trì hoãn việc tái chế AppDomain, bạn có thể muốn vô hiệu hóa nó.

Có một hành vi Thông báo thay đổi tệp (FCN) có thể bị vô hiệu hóa.

Registry

Ban đầu, nó là một mục đăng ký DWORD tại HKLM\Software\Microsoft\ASP.NET\FCNMode, setting the value to 1 should disable it.

Mã (hack) lên đến .NET Framework 4,0

này Hack có thể làm việc với 2,0-3,5 và 4,0 khung.

//Disable AppDomain restart on file change 

System.Reflection.PropertyInfo p = 
    typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", 
     System.Reflection.BindingFlags.NonPublic 
     | System.Reflection.BindingFlags.Public 
     | System.Reflection.BindingFlags.Static); 

object fcm = p.GetValue(null, null); 

System.Reflection.MethodInfo m = fcm.GetType().GetMethod("Stop", 
    System.Reflection.BindingFlags.Instance 
    | System.Reflection.BindingFlags.NonPublic); 
m.Invoke(fcm, new object[] { }); 

Thả mã này vào số Global.asaxApplication_Start. Xem here.

Nếu bạn muốn vô hiệu hóa việc giám sát các đường dẫn hoặc tệp cụ thể, bạn có thể sử dụng phương pháp StopMonitoringFile hoặc StopMonitoringPath từ FileChangesMonitor. Tuy nhiên, thư mục Bin là một thư mục đặc biệt và có thể miễn dịch với hai phương pháp này.

Ít nhất, bạn có thể chơi với trường _dirMonSpecialDirs và gọi StopMonitoring() trên thư mục Bin của bạn.

Khuôn khổ .NET 4.5

Trong Khuôn khổ .NET 4.5, một thuộc tính HttpRuntimeSection.FcnMode tồn tại. Không có nhiều tài liệu về nó nhưng bạn có thể sử dụng <httpRuntime fcnMode="Disabled"/>.

+0

Cảm ơn bạn đã nhập, nhưng theo hình ảnh trong bài viết tôi đã liên kết, nó sẽ hoạt động theo cách đó. Tôi cũng muốn tránh vô hiệu hóa FCN, nhưng tôi có thể thử nó là shure nó thực sự là nguyên nhân của vấn đề của tôi ... – ChrFin

+0

Bạn có thể đúng nhưng tôi chưa bao giờ thấy nó hoạt động: ( – JoeBilly

+4

Tôi có thể xác nhận rằng DOES làm việc trong 4.5. Cảm ơn! – Bernesto