ASP.NET - Динамически зарегистрировать HttpHandler в коде (не в web.config) [дубликат]
-
21-09-2019 - |
Вопрос
Возможный Дубликат:
Есть какой-нибудь способ добавить 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 программно, выполнив следующие действия:
- Если это приложение WebForms, то убедитесь, что ваше веб-приложение имеет конфигурацию маршрутизации URL в web.config (yip частично нарушает ваше первоначальное требование о внесении минимальных изменений в web.config), как объяснено MS здесь: Используйте маршрутизацию с веб-формами
- Реализуйте интерфейс IRouteHandler в вашем обработчике и возвращайте hander в качестве результата в его методах (см. Первый пример ниже).
- Зарегистрируйте свой маршрут (смотрите второй пример ниже).
Реализовать 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