Подтвердить что ты не робот

ASP.NET - динамически регистрировать HttpHandler в коде (не в web.config)

Возможный дубликат:
Любой способ добавить HttpHandler программно в .NET?

Есть ли способ динамически зарегистрировать код IHttpHandler в коде С# вместо того, чтобы вручную добавить его в раздел system.web/httpHandlers в файле web.config.

Это может показаться сумасшедшим, но у меня есть все основания для этого. Я создаю WidgetLibrary, которую владелец веб-сайта может использовать, просто отбросив файл .dll в свой каталог bin и хочу поддерживать это с минимальной конфигурацией в web.config.

4b9b3361

Ответ 1

Я не считаю возможным изменять зарегистрированные HttpHandlers после запуска AppDomain, потому что доступные обработчики считываются непосредственно из файла web.config, затем кэшируются в частной структуре данных.

Если вы знали заранее, какие расширения вы хотите разрешить, вы можете сделать это, чтобы сопоставить эти расширения с одним HttpHandlerFactory, а затем вернуть обработчик по вашему выбору (используя динамическую загрузку и отражение сборки). Например:

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

Изменение web.config во время выполнения приведет к перезапуску AppDomain.

Ответ 2

Вы не можете изменять обработчики, но вы можете добавить маршрут к своему программному обеспечению программно следующим образом:

  • Если приложение WebForms затем гарантирует, что ваш webapp имеет конфигурацию UrlRouting в web.config(yip разбивает часть вашего первоначального требования на минимальные изменения в web.config), как объясняется здесь MS: Использовать маршрутизацию с веб-формами
  • Внедрить интерфейс IRouteHandler на вашем обработчике и вернуть обработчик в качестве результата в его методы (см. первый пример ниже)
  • Зарегистрируйте свой маршрут (см. второй пример ниже)

Реализовать 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;
    }
}

Регистрация маршрута:

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

Там у вас есть. Поручитель зарегистрировал код.:)

Ответ 3

При создании элемента управления я обычно переопределяю функцию GetDesignTimeHtml в классе ControlDesigner. Из этой функции я проверяю, зарегистрирован ли HttpHandler, а если нет, я зарегистрирую его. Вот код, который я использую для регистрации нового HttpHandler:

    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);
            }
        }

    }

Свойство Action является статическим HttpHandlerAction