ASP.NET - динамически регистрировать HttpHandler в коде (не в web.config)
Возможный дубликат:
Любой способ добавить HttpHandler программно в .NET?
Есть ли способ динамически зарегистрировать код IHttpHandler
в коде С# вместо того, чтобы вручную добавить его в раздел system.web/httpHandlers
в файле web.config.
Это может показаться сумасшедшим, но у меня есть все основания для этого. Я создаю WidgetLibrary, которую владелец веб-сайта может использовать, просто отбросив файл .dll в свой каталог bin и хочу поддерживать это с минимальной конфигурацией в web.config.
Ответы
Ответ 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