2012-06-06 28 views
6

Tôi có một thiết lập trang web trong IIS với một web.config đặt ở gốc cho nhiều ảo ứng dụng phụ (khoảng 35), một số trong đó sử dụng các ghi đè duy nhất của riêng chúng/cấu hình.Chia sẻ một HttpModule giữa nhiều ứng dụng con mà không có GAC

Tôi có hai HttpModules mà tôi muốn triển khai cho tất cả các ứng dụng phụ cùng một lúc. Nếu không sử dụng GAC, có cách nào để chỉ định việc triển khai trong web.config để các mô-đun này có thể áp dụng cho tất cả các ứng dụng con mà không cần biên dịch lại mã mô-đun vào từng ứng dụng con không? Tôi có thể lưu trữ hội đồng HttpModule ở đâu đó trong cấu trúc trang web mà nó có thể được sử dụng bởi tất cả các ứng dụng phụ không?

Trả lời

4

Có thể đăng ký mô-đun http trong web.config gốc (system.webServer/modules phần). Mô-đun phải có tên mạnh (phải được ký):

<add name="MyModule" preCondition="managedHandler" type="MyModule.Namespace, MyModuleAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bfd166351ed997df" /> 

Bây giờ IIS mong rằng mô-đun nằm trong thư mục bin (hoặc trong GAC). dependentAssembly phần hướng dẫn IIS nơi có thể là tệp lắp ráp được tìm thấy:

<runtime> 
     <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="MyModuleAssembly" publicKeyToken="bfd166351ed997df"/> 
       <codeBase version="1.0.0.0" 
          href="file://c:/SharedLibs/MyModuleAssembly.dll" /> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
1

Bạn có thể thêm các mô đun http vào một dll. Đặt dlls trong thư mục bin của các ứng dụng của bạn và tham khảo các mô-đun http từ web.config

<add name="MyHttpModule" type="MyDll.MyHttpModule, MyDll" /> 
2

Giả sử bình thường thêm nó vào cấu hình web và thư mục bin sau khi thực tế không làm việc cho bạn có một vài khả năng cho bạn trong khuôn khổ hiện tại:

Nếu bạn không nhớ thay đổi configs web, nhưng cần phải lưu trữ các mô-đun bên ngoài thùng bạn có thể sử dụng System.Web.PreApplicationStartMethod đăng ký một handler cho AppDomain Sự kiện .AssemblyResolve sau đó có bộ xử lý sự kiện và trả lại loại

Nếu bạn không muốn sửa đổi web.config hoặc cần sự kiện của bạn ở trên cùng của ngăn xếp như bạn sẽ nhận được bằng cách GACing nó và thay đổi cấu hình web cấp máy bạn có thể sử dụng System.Web.PreApplicationStartMethod để có được mã để chạy khi khởi động chỉ bằng cách trong thư mục bin sau đó sử dụng Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule từ thư viện MVC Razor. Việc này sẽ cho bạn kết quả tương tự như là mô-đun cuối cùng trong danh sách mô-đun máy.

Nếu bạn không muốn sửa đổi cấu hình web và cần phải sớm hơn trong ngăn sự kiện thì bạn cần phải làm điều gì đó để sắp xếp lại trình xử lý sự kiện. Tôi cần phải làm điều này một lần để thử và gỡ lỗi một cái gì đó đã nuốt lỗi. Một poking ít về trong phản xạ và tôi đã đưa ra chức năng này để có được những xử lý sự kiện hiện

Dim t As Type = target.[GetType]() 

Public Function GetEventSubscribers(ByVal target As Object, ByVal eventName As String) As [Delegate]() 
    Dim w = CType(t.GetField("_events", BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.NonPublic).GetValue(target), System.ComponentModel.EventHandlerList) 
    Dim k = t.GetFields(BindingFlags.[Static] Or BindingFlags.Instance Or BindingFlags.NonPublic).Where(Function(x) x.Name.StartsWith("Event" & eventName)).Select(Function(x) x.GetValue(target)).ToList() 
    Dim d() As [Delegate] = k.SelectMany(Function(x) 
     If w(x) Is Nothing Then 
      New [Delegate]() {} 
     Else 
      Return w(x).GetInvocationList() 
     End If 
    End Function).ToArray 
    Return d 
End Function 

Nếu bạn vượt qua dụ HttpApplication đến nó với một EventName bạn nhận được tất cả các đại biểu handler đăng ký, mà sẽ cho phép bạn gọi RemoveEventHandler() trên mỗi người trong số họ.

Nếu bạn làm điều đó với sự kiện lỗi, sau đó thêm trình xử lý của riêng bạn, sau đó thêm lại các đại biểu có sẵn theo thứ tự đúng thì trình xử lý của bạn kích hoạt trước, trước khi bất kỳ trình xử lý nào khác có cơ hội ngay cả trạng thái và phần còn lại của ứng dụng dường như không có gì khôn ngoan hơn nếu bạn không tự thay đổi trạng thái của sự kiện.

+0

Đây là mẹo cực kỳ hữu ích. Cảm ơn – NickSuperb

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