ASP.NET - Динамически зарегистрировать HttpHandler в коде (не в web.config) [дубликат]

StackOverflow https://stackoverflow.com/questions/2500680

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

  1. Если это приложение WebForms, то убедитесь, что ваше веб-приложение имеет конфигурацию маршрутизации URL в web.config (yip частично нарушает ваше первоначальное требование о внесении минимальных изменений в web.config), как объяснено MS здесь: Используйте маршрутизацию с веб-формами
  2. Реализуйте интерфейс IRouteHandler в вашем обработчике и возвращайте hander в качестве результата в его методах (см. Первый пример ниже).
  3. Зарегистрируйте свой маршрут (смотрите второй пример ниже).

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

Вот оно, у вас есть.Хандер зарегистрировал этот код.:)

При создании элемента управления я обычно переопределяю функцию 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top