2010-03-23 31 views
12

thể trùng lặp:
Any way to add HttpHandler programatically in .NET?ASP.NET - Tự động đăng ký một HttpHandler trong mã (không phải trong web.config)

Có cách nào tôi có thể tự động đăng ký một IHttpHandler trong C# mã, thay vì phải tự thêm nó vào phần system.web/httpHandlers trong web.config.

Điều này nghe có vẻ điên rồ, nhưng tôi có lý do chính đáng để thực hiện việc này. Tôi đang xây dựng một WidgetLibrary mà một chủ sở hữu trang web có thể sử dụng chỉ bằng cách thả một tập tin .dll vào thư mục bin của họ, và muốn hỗ trợ điều này với cấu hình tối thiểu cho web.config.

+1

Câu hỏi này trùng lặp và câu trả lời có vẻ không chính xác. –

Trả lời

8

Tôi không tin rằng có thể sửa đổi HttpHandlers đã đăng ký sau khi AppDomain đang chạy vì trình xử lý có sẵn được đọc trực tiếp từ tệp web.config sau đó được lưu trong cấu trúc dữ liệu riêng tư.

Nếu bạn biết bạn muốn cho phép tiện ích mở rộng nào, bạn có thể lập bản đồ các tiện ích này thành một đơn HttpHandlerFactory và sau đó trả lại trình xử lý theo lựa chọn của bạn (bằng cách sử dụng tải và phản chiếu lắp ráp động). Ví dụ:

<add path="*.ch1,*.ch2,*.ch3" verb="*" 
    type="MyHandlers.MyHandlerFactory, MyHandlers" /> 

Sửa đổi web.config khi chạy sẽ làm cho AppDomain khởi động lại.

2

Khi tạo điều khiển, tôi thường ghi đè lên hàm GetDesignTimeHtml trong lớp ControlDesigner của tôi. Từ chức năng đó tôi kiểm tra xem HttpHandler có được đăng ký không và nếu không, tôi sẽ đăng ký nó. Đây là mã tôi sử dụng để đăng ký HttpHandler mới:

private void RegisterHttpHandler() 
    { 

     IWebApplication webApplication = 
      (IWebApplication)this.GetService(typeof(IWebApplication)); 

     if (webApplication != null) 
     { 
      Configuration configuration = webApplication.OpenWebConfiguration(false); 
      if (configuration != null) 
      { 
       HttpHandlersSection section = 
        (HttpHandlersSection)configuration.GetSection(
        "system.web/httpHandlers"); 
       if (section == null) 
       { 
        section = new HttpHandlersSection(); 
        ConfigurationSectionGroup group = 
         configuration.GetSectionGroup("system.web"); 
        if (group == null) 
        { 
         configuration.SectionGroups.Add("system.web", 
          new ConfigurationSectionGroup()); 
        } 
        group.Sections.Add("httpHandlers", section); 
       } 
       section.Handlers.Add(Action); 
       configuration.Save(ConfigurationSaveMode.Minimal); 
      } 
     } 

    } 

Thuộc tính hành động là một HttpHandlerAction tĩnh

17

Bạn không thể sửa đổi các trình xử lý nhưng bạn có thể thêm một tuyến đường để hander bạn programatically theo các bước sau :

  1. Nếu ứng dụng của một WebForms của nó sau đó đảm bảo webapp của bạn có cấu hình UrlRouting trong web.config (yip phá vỡ một phần của yêu cầu ban đầu của bạn có thay đổi tối thiểu để web.config) như được giải thích bởi MS ở đây: Use Routing with Web Forms
  2. Thực hiện giao diện IRouteHandler trên xử lý của bạn và trả lại hander như là kết quả trong các phương pháp của nó (xem ví dụ đầu tiên bên dưới)
  3. đăng ký tuyến đường của bạn (xem ví dụ thứ hai dưới đây)

Thực hiện IRouteHandler

public class myHandler : IHttpHandler, IRouteHandler 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     // your processing here 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return this; 
    } 
} 

Đăng ký Route:

//from global.asax.cs 
protected void Application_Start(object sender, EventArgs e) 
{ 
    RouteTable.Routes.Add(new Route 
    (
     "myHander.axd", 
     new myHandler() 
    )); 
} 

Ở đó bạn có nó. Một hander đăng ký mặc dù mã. :)

+0

Đây là phương thức tương tự với StackExchange.MiniProfiler đăng ký tuyến đường và trình xử lý của nó cho phần tử giao diện người dùng của nó (bạn vẫn cần một trình xử lý cho nó mặc dù) –

+1

Làm việc như một sự quyến rũ! Cảm ơn bạn! –

+0

Tôi đã cố thực hiện điều này nhưng trình xử lý không được đăng ký. Tôi có nên thêm một số mã vào void công cộng ProcessRequest (HttpContext context)? – SSED

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