ASP.NET — разрешить загруженный путь HttpHandler

Есть ли в ASP.NET способ программно разрешить путь к загруженному HttpHandler, как он определен в Web.config? (например, SomeModule.axd)?


person Nathan Taylor    schedule 29.08.2009    source источник


Ответы (3)


Если я правильно понимаю вопрос, вы хотите получить путь из web.config, верно?

Если это так, то вы, вероятно, ищете что-то вроде этого:

string p = null;
System.Web.Configuration.HttpHandlersSection httpHandlersSection =
    (System.Web.Configuration.HttpHandlersSection)
        System.Configuration.ConfigurationManager.GetSection("system.web/httpHandlers");

foreach (System.Web.Configuration.HttpHandlerAction handler in httpHandlersSection.Handlers)
{
    if(handler.Type == "myType")
    {
        p = handler.Path;
        break;
    }
}

Хитрость здесь заключается в операторе if. У обработчиков в web.config нет понятных «имен», которые можно использовать в качестве ключа. Все, что у них есть, это типы (которые могут быть уродливыми строками), пути и глагол. Чтобы найти конкретный обработчик, который вас интересует, вам, возможно, придется искать в типе или пути обработчика известную подстроку, которая идентифицирует конкретный обработчик, который вас интересует.

person Stephen M. Redd    schedule 07.10.2009
comment
Это довольно приличное решение, хотя и косвенное (по стандартам .NET). Было бы очень хорошо, если бы существовал какой-то стандартный локатор службы фреймворка, который можно было бы сопоставить с HttpHandlers для удобного взаимодействия с отдельными модулями. Что-то стоит рассмотреть, я бы сказал! - person Nathan Taylor; 07.10.2009
comment
Вообще говоря, пользовательскому коду необычно иметь необходимость исследовать внутреннюю конфигурацию приложения на этом уровне. Кроме того, есть встроенные обработчики и другие, которые регистрируются через конфигурацию на уровне машины. Затем есть HttpHandlerFactories, которые динамически регистрируют обработчики по требованию. Между динамической природой обработчиков и потенциальными соображениями безопасности я могу понять, почему не так много способов прямого доступа к этим объектам. - person Stephen M. Redd; 07.10.2009
comment
Для тех, у кого была та же головная боль, что и у меня, помните, что system.web/httpHandlers IS чувствителен к регистру. Это означает, что H в слове Handlers — это капитолий. - person International Spectrum; 03.08.2010

Из текущего контекста http используйте свойство path объекта Request.

person Kevin    schedule 01.09.2009

Если вас интересует путь к обработчику, обрабатывающему текущий запрос:

string path = HttpContext.Current.Handler.GetType().Assembly.CodeBase;

Если бы вы знали, где найти коллекцию других экземпляров обработчика, вы могли бы использовать тот же подход, чтобы получить их пути.

person Andrew Arnott    schedule 13.10.2009
comment
На самом деле я пытаюсь разрешить виртуальный путь к обработчику, а не расположение самой DLL. т.е. если тип MyHandler зарегистрирован в MyHandler.axd, я хочу разрешить MyHandler.axd. - person Nathan Taylor; 13.10.2009